发布时间:2026/7/17 0:02:36
HarmonyOS 应用开发《掌上英语》第18篇:Grid 布局实战——从功能 5 宫格到练习 2×2 模式
Grid 布局实战——从功能 5 宫格到练习 2×2 模式引言Grid 布局是 ArkTS 中最强大的布局容器之一它通过行列模板系统实现灵活的多列多行布局。在本英语学习 App 中Grid 布局贯穿了首页的多个核心模块功能栏 5 宫格、练习模式 2×2 卡片、以及响应式学习进度区。本文将通过这些实战案例深入剖析 Grid 的配置技巧和最佳实践。一、Grid 布局核心概念ArkTS 的 Grid 组件采用模板驱动的方式定义行列结构核心属性包括columnsTemplate定义列模板如1fr 1fr 1fr表示三等分rowsTemplate定义行模板如1fr 1fr表示二等分不指定则自动换行columnsGap/rowsGap列间距 / 行间距子组件通过GridItem包裹自动按顺序填充fr 单位的理解frfraction是 Grid 布局中的弹性单位表示可用空间的比例分配1fr 1fr 1fr 1fr 1fr → 等分为 5 列每列占 1/5 1fr 2fr → 第一列占 1/3第二列占 2/3 100vp 1fr 1fr → 第一列固定 100vp后两列平分剩余空间二、功能栏 5 宫格——固定列数 Grid2.1 业务需求首页需要一个展示 5 个核心功能的快捷入口搜单词、易错词、生词本、笔记、学习报告。采用固定 5 列布局每个图标图标大小一致。2.2 代码实现// 数据定义Localfunctions:CourseCoreBar[][newCourseCoreBar($r(app.media.ic_practice_camera),搜单词),newCourseCoreBar($r(app.media.ic__practice_wrong_question),易错词),newCourseCoreBar($r(app.media.ic_practice_star),生词本),newCourseCoreBar($r(app.media.ic_practice_notes),笔记),newCourseCoreBar($r(app.media.ic_chart_report),学习报告)];// 功能栏 BuilderBuilderfunctionBarBuilder(){Grid(){ForEach(this.functions,(item:CourseCoreBar){GridItem(){CourseCoreBuilder(item);};},(item:CourseCoreBar,index:number)item.descriptionindex);}.columnsTemplate(1fr 1fr 1fr 1fr 1fr)// 固定 5 列.columnsGap($r(app.float.vp_4)).width(100%).padding($r(app.float.vp_8)).borderRadius($r(app.float.vp_16)).backgroundColor($r(sys.color.background_primary));}// 全局 Builder每个功能项BuilderexportfunctionCourseCoreBuilder(mainFunctionItem:CourseCoreBar){Column(){Image(mainFunctionItem.showIcon).height($r(app.float.vp_24)).width($r(app.float.vp_24)).margin({bottom:$r(app.float.vp_2)});Text(mainFunctionItem.description).fontSize($r(sys.float.Caption_M));}.width(100%).height(72).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).stateStyles({pressed:{.scale({x:0.97,y:0.97})}}).onClick((){// 路由跳转});}2.3 关键设计要点columnsTemplate(1fr 1fr 1fr 1fr 1fr)五个1fr表示 5 等分每列宽度相同不指定rowsTemplateGrid 会自动根据子项数量换行5 个刚好一行GridItem宽度自适应默认填满所在列的宽度columnsGap设置 4vp 的列间距避免图标过于紧凑key生成使用item.description index确保每个 GridItem 有唯一标识三、练习模式 2×2——固定列数 LazyForEach3.1 业务需求练习模式展示 4 个大卡片单词记忆、听力训练、阅读训练、语法练习。采用 2×2 的宫格布局使用LazyForEach实现数据懒加载。3.2 数据模型exportclassPracticeView{imageUri:ResourceStr;name:string;describe:string;constructor(imageUri:ResourceStr,name:string,describe:string){this.imageUriimageUri;this.namename;this.describedescribe;}}exportconstPRACTICE_LIST_DATA:PracticeView[][newPracticeView($r(app.media.ic_sequence),单词记忆,每日单词打卡),newPracticeView($r(app.media.ic_practice_simulations),听力训练,沉浸式听力练习),newPracticeView($r(app.media.ic_practice_test_paper),阅读训练,英文原著阅读),newPracticeView($r(app.media.ic_wrong_question),语法练习,语法专项突破),];3.3 代码实现BuilderpracticeModeBuilder(){Text(练习模式).fontSize($r(sys.float.Subtitle_L)).fontWeight(FontWeight.Medium).fontColor($r(sys.color.font_primary)).width(100%).textAlign(TextAlign.Start).margin({bottom:$r(app.float.vp_12)});Grid(){LazyForEach(this.dataSource,(practiceItem:PracticeView){GridItem(){ReusableFlowItem({item:practiceItem});}.onClick((){// 路由跳转逻辑if(practiceItem.name单词记忆){RouterModule.push({url:RouterMap.ANSWER_QUESTIONS_PAGE,param:1});}elseif(practiceItem.name听力训练){RouterModule.push({url:RouterMap.Mock_PAGE,param:1});}elseif(practiceItem.name阅读训练){RouterModule.push({url:RouterMap.Mock_PAGE,param:2});}else{RouterModule.push({url:RouterMap.ANSWER_QUESTIONS_PAGE,param:5});}});},(practiceItem:PracticeView,index:number)practiceItem.nameindex);}.padding($r(app.float.vp_12)).backgroundColor($r(sys.color.background_primary)).columnsTemplate(1fr 1fr)// 固定 2 列.rowsGap($r(app.float.vp_12)).columnsGap($r(app.float.vp_12)).borderRadius($r(app.float.vp_16));}3.4 ReusableFlowItem 子组件每个 GridItem 内部使用ReusableFlowItem自定义组件来渲染卡片内容ComponentV2struct ReusableFlowItem{Paramitem:PracticeViewnewPracticeView($r(app.media.ic_home),顺序练习,1、3256);build(){Row(){Column(){Text(this.item.name).textOverflow({overflow:TextOverflow.Ellipsis}).maxLines(1).fontWeight(FontWeight.Bold).fontSize($r(sys.float.Body_S)).fontColor($r(sys.color.font_primary));Text(this.item.describe).textOverflow({overflow:TextOverflow.Ellipsis}).maxLines(1).fontSize($r(sys.float.Caption_M)).fontWeight(FontWeight.Regular).fontColor($r(sys.color.font_secondary)).margin({top:$r(app.float.vp_2)});}.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Start).layoutWeight(1);Image(this.item.imageUri).interpolation(ImageInterpolation.High).objectFit(ImageFit.Fill).width(40).height(40).clip(true).margin({left:$r(app.float.vp_4),right:$r(app.float.vp_4)});}.stateStyles({pressed:{.scale({x:0.97,y:0.97})}}).backgroundColor($r(sys.color.background_secondary)).justifyContent(FlexAlign.SpaceBetween).height(100).width(100%).padding({left:$r(app.float.vp_12),right:$r(app.float.vp_16)}).borderRadius($r(app.float.vp_12));}}3.5 LazyForEach vs ForEach特性ForEachLazyForEach数据量范围小规模 50 项大规模 50 项渲染策略一次性渲染所有项按需渲染可见项数据源要求数组实现 IDataSource 接口性能小数据量时更简单大数据量时更高效本项目中练习模式虽然只有 4 项但使用LazyForEachIDataSource的架构方便后续扩展更多练习模式。四、学习进度 Grid——响应式列数控制4.1 业务需求学习进度区域需要根据设备宽度自适应列数手机单列、平板双列、桌面三列。4.2 响应式 Grid 实现BuildersubjectPracticeBuilder(){Text(学习进度).fontSize(18).fontWeight(FontWeight.Bold).fontColor($r(sys.color.font_primary)).width(100%).textAlign(TextAlign.Start).margin($r(app.float.vp_12));if(!this.logoUser.isLogin){// 未登录状态// ...}else{Grid(){ForEach(this.coursePractice,(item:CourseQuestions){GridItem(){CoursePracticeBuilder(item);};},(item:CourseQuestions,index:number)item.subjectNameindex);}.columnsTemplate(1fr .repeat(newBreakpointTypenumber({sm:1,// 手机单列md:2,// 平板双列lg:3,// 桌面三列xl:3// 大屏三列}).getValue(this.homeVM.breakPointModel.currentBreakpoint))).columnsGap($r(app.float.vp_6)).rowsGap($r(app.float.vp_6)).borderRadius($r(app.float.vp_16));}}4.3 动态列模板构建技巧核心技巧在于1fr .repeat(n)的字符串构建模式// 假设当前断点为 md平板constcolumnsnewBreakpointTypenumber({sm:1,md:2,lg:3,xl:3}).getValue(this.homeVM.breakPointModel.currentBreakpoint);// columns 2consttemplate1fr .repeat(columns);// template 1fr 1fr → 双列布局这种方式比手写条件判断更简洁// ❌ 不推荐条件判断冗长.columnsTemplate(this.breakpointsm?1fr:this.breakpointmd?1fr 1fr:1fr 1fr 1fr)// ✅ 推荐BreakpointType 封装.columnsTemplate(1fr .repeat(breakpointType.getValue(currentBreakpoint)))五、Grid 布局对比总结场景列数策略rowsTemplate数据遍历间距功能栏 5 宫格固定 5 列不指定自动换行ForEach4vp练习模式 2×2固定 2 列不指定自动换行LazyForEach12vp学习进度响应式 1-3 列不指定自动换行ForEach6vp六、最佳实践6.1 GridItem 高度一致当不指定rowsTemplate时Grid 会自动让同一行的 GridItem 高度相同。如果希望每个卡片高度不同应显式设置rowsTemplate。6.2 卡片点击反馈使用stateStyles添加按压缩放效果.stateStyles({pressed:{.scale({x:0.97,y:0.97})}})6.3 唯一 key 的重要性Grid 中每个 GridItem 必须有唯一的 key用于框架的差异更新// ❌ 不推荐使用固定值(item)item// ✅ 推荐使用唯一标识(item:CourseCoreBar,index:number)item.descriptionindex总结Grid 布局是 ArkTS 中最灵活的多列布局方案。通过本文的三个实战案例我们掌握了固定列数布局功能栏 5 宫格和练习模式 2×2适合已知数据量的场景响应式列数布局结合BreakpointType实现不同断点下的自适应数据遍历选择ForEach适合小数据量LazyForEach适合大数据量和懒加载GridItem 封装将卡片内容抽为独立组件提升可维护性掌握这些 Grid 布局技巧就能应对绝大多数多列 UI 场景。

相关新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制
2026/7/17 0:02:36

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

阅读更多
5个强力功能让Buzz成为你的终极离线语音转录助手
2026/7/16 23:02:36

5个强力功能让Buzz成为你的终极离线语音转录助手

5个强力功能让Buzz成为你的终极离线语音转录助手 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 还在为音频转录而烦恼吗&…

阅读更多
告别枯燥界面!用foobox-cn打造你的专属音乐播放器
2026/7/16 23:02:36

告别枯燥界面!用foobox-cn打造你的专属音乐播放器

告别枯燥界面!用foobox-cn打造你的专属音乐播放器 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你是不是还在使用foobar2000那个看起来有点过时的默认界面?虽然foobar2000的…

阅读更多
Windows 11虚拟机安装与优化全攻略
2026/7/17 2:02:36

Windows 11虚拟机安装与优化全攻略

1. Windows 11虚拟机体验全景指南 在实体机上安装新系统总让人顾虑重重——驱动兼容性、系统稳定性、数据安全性都是不得不考虑的问题。而虚拟机技术恰好为我们提供了完美的沙箱环境,让系统体验变得轻松无负担。最近微软发布了Windows 11 23H2更新,虚拟机…

阅读更多
C++名称空间深度解析:从命名冲突解决到大型项目工程实践
2026/7/17 2:02:36

C++名称空间深度解析:从命名冲突解决到大型项目工程实践

1. 项目概述:为什么我们需要名称空间?在C的世界里,命名冲突是一个让无数开发者头疼不已的“经典”问题。想象一下,你正在开发一个大型的图形处理库,里面定义了一个非常通用的Matrix类。与此同时,你的项目又…

阅读更多
Linux文件删除安全指南与防护方案
2026/7/17 2:02:36

Linux文件删除安全指南与防护方案

1. 为什么我们需要认真对待Linux文件删除在Windows系统中删除文件时,文件会先进入回收站,这给了我们反悔的机会。但Linux的rm命令设计哲学完全不同——它默认采用"一次删除,永久消失"的工作方式。这种差异源于Linux作为服务器操作系…

阅读更多
Windows Server 2022部署前后端分离项目实战指南
2026/7/17 2:02:36

Windows Server 2022部署前后端分离项目实战指南

1. Windows Server 2022 部署前后端项目概述最近接手了一个企业级应用系统的部署任务,客户要求将前后端分离项目部署到Windows Server 2022环境中。这种部署场景在企业内部系统中非常常见,特别是那些长期依赖Windows生态的客户。与Linux部署相比&#xf…

阅读更多
Windows 11虚拟机C盘扩容全攻略
2026/7/17 2:02:36

Windows 11虚拟机C盘扩容全攻略

1. 为什么需要给Windows 11虚拟机扩容?在VMware Workstation中运行Windows 11虚拟机时,经常会遇到C盘空间不足的困扰。这个问题通常源于以下几个典型场景:初始分配空间不足:很多用户在创建虚拟机时,习惯性采用默认的60…

阅读更多
esp32开发与应用(和stm32f103用spi通信)
2026/7/17 1:02:36

esp32开发与应用(和stm32f103用spi通信)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 现在esp32和mcu一起出现的场合很多,前者适合网络传输和屏幕显示,后者则多出现在工业场景。所以两者一起出现就可以发挥各自…

阅读更多
智慧树刷课插件:5分钟实现自动化学习的智能助手
2026/7/16 21:32:43

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

阅读更多
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案
2026/7/16 15:03:34

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

阅读更多
办公自动化实战:5个免费工具构建合同处理流水线
2026/7/16 22:47:50

办公自动化实战:5个免费工具构建合同处理流水线

1. 这不是“又一个工具包”,而是一套经过237次真实场景验证的效率组合拳“2026.04.28实用教程工具分享”这个标题乍看平平无奇,像极了你邮箱里被自动归入“促销/订阅”文件夹的那类通知——但如果你真把它当普通更新忽略,接下来半年里&#x…

阅读更多
2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制
2026/7/17 0:02:36

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

阅读更多
HarmonyOS 应用开发《掌上英语》第18篇:Grid 布局实战——从功能 5 宫格到练习 2×2 模式
2026/7/17 0:02:36

HarmonyOS 应用开发《掌上英语》第18篇:Grid 布局实战——从功能 5 宫格到练习 2×2 模式

Grid 布局实战——从功能 5 宫格到练习 22 模式引言 Grid 布局是 ArkTS 中最强大的布局容器之一,它通过行列模板系统实现灵活的多列多行布局。在本英语学习 App 中,Grid 布局贯穿了首页的多个核心模块:功能栏 5 宫格、练习模式 22 卡片、以及…

阅读更多
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析
2026/7/17 0:02:36

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/13 21:11:56

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/14 16:39:14

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/14 16:39:14

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多