鸿蒙应用开发:Grid组件实现九宫格布局教程
文章目录一、Grid组件简介二、基础九宫格实现三、Grid核心属性详解3.1 columnsTemplate - 列模板配置3.2 rowsTemplate - 行模板配置3.3 间距控制3.4 滚动支持四、高级九宫格示例五、布局方向与对齐方式六、响应式网格布局七、性能优化建议八、常见问题与解决方案问题1GridItem不显示问题2布局错乱问题3滚动不流畅九、总结十、进一步学习这是一个使用鸿蒙技术开发的本地原生记账应用非常适合大家用来练手。相关源码已上传至 Github点击此处查看项目。欢迎大家交流、指正也欢迎提交 PR。一、Grid组件简介在鸿蒙应用开发中Grid 组件是一种强大的网格布局容器能够将子元素按照行和列的网格形式进行排列。与Flex布局相比Grid 布局更加灵活特别适合实现九宫格、商品列表、图片墙等规整的布局效果。二、基础九宫格实现下面我们来看如何使用 Grid 组件实现一个基础的九宫格布局EntryComponentstruct GridExample{// 定义九宫格数据privategridData:string[][1,2,3,4,5,6,7,8,9]build(){Column(){Grid(){ForEach(this.gridData,(item:string){GridItem(){// 自定义的九宫格项组件GridItemContent({text:item})}})}.columnsTemplate(1fr 1fr 1fr)// 设置3列每列等宽.rowsGap(12)// 行间距.columnsGap(12)// 列间距}.width(100%).height(100%).padding(12)}}// 九宫格项组件Componentstruct GridItemContent{Proptext:stringbuild(){Column(){// 图片组件Image($r(app.media.startIcon)).width(60).height(60).borderRadius(8)// 文本组件Text(this.text).fontSize(16).margin({top:8})}.width(100%).height(120).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).backgroundColor(Color.White).borderRadius(12).shadow({radius:4,color:#00000020,offsetX:0,offsetY:2})}}运行效果关键点说明Grid的直接子元素必须是GridItemGrid 组件内部需要使用 GridItem 来包裹实际的子元素ForEach遍历数据使用 ForEach 来遍历数组数据动态生成网格项columnsTemplate设置列数1fr 1fr 1fr表示将父组件宽度平均分成 3 列三、Grid核心属性详解3.1 columnsTemplate - 列模板配置columnsTemplate属性用于定义网格的列数和每列的宽度比例// 3列等宽布局.columnsTemplate(1fr 1fr 1fr)// 4列等宽布局.columnsTemplate(1fr 1fr 1fr 1fr)// 不等宽布局第一列占2份其余各占1份总共5份.columnsTemplate(2fr 1fr 1fr 1fr)// 混合单位固定宽度自适应.columnsTemplate(100px 1fr 2fr)3.2 rowsTemplate - 行模板配置类似地我们可以使用rowsTemplate来定义行的高度// 定义3行高度分别为100px、自适应、200px.rowsTemplate(100px 1fr 200px)3.3 间距控制Grid提供了灵活的间距控制属性Grid(){// ... GridItem内容}.rowsGap(16)// 行间距16vp.columnsGap(16)// 列间距16vp3.4 滚动支持当Grid的内容超出容器高度时会自动显示滚动条Grid(){// ... 多个GridItem}.height(400)// 固定高度超出则滚动.scrollable(ScrollDirection.Vertical)// 垂直滚动四、高级九宫格示例下面是一个更完整的九宫格应用示例包含点击事件和动态数据EntryComponentstruct AdvancedGridExample{// 九宫格数据模型privategridItems:GridItemData[][{id:1,title:相册,icon:$r(app.media.startIcon),color:#FF6B6B},{id:2,title:音乐,icon:$r(app.media.startIcon),color:#4ECDC4},{id:3,title:视频,icon:$r(app.media.startIcon),color:#45B7D1},{id:4,title:文档,icon:$r(app.media.startIcon),color:#96CEB4},{id:5,title:下载,icon:$r(app.media.startIcon),color:#FFEAA7},{id:6,title:设置,icon:$r(app.media.startIcon),color:#DDA0DD},{id:7,title:帮助,icon:$r(app.media.startIcon),color:#98D8C8},{id:8,title:关于,icon:$r(app.media.startIcon),color:#F7DC6F},{id:9,title:更多,icon:$r(app.media.startIcon),color:#BB8FCE}]build(){Column(){Text(应用九宫格).fontSize(24).fontWeight(FontWeight.Bold).margin({bottom:20})Grid(){ForEach(this.gridItems,(item:GridItemData){GridItem(){this.buildGridItem(item)}.onClick((){// 处理点击事件this.onItemClick(item)})})}.columnsTemplate(1fr 1fr 1fr).rowsTemplate(1fr 1fr 1fr).rowsGap(15).columnsGap(15).width(90%).aspectRatio(1)// 保持正方形.layoutDirection(GridDirection.Row)}.width(100%).height(100%).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).backgroundColor(#F5F5F5)}// 构建网格项BuilderbuildGridItem(item:GridItemData){Column(){Image(item.icon).width(40).height(40).objectFit(ImageFit.Contain)Text(item.title).fontSize(14).margin({top:8}).fontColor(#333333)}.width(100%).height(100%).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).backgroundColor(Color.White).borderRadius(16).shadow({radius:6,color:#00000015,offsetX:0,offsetY:3})}// 点击事件处理onItemClick(item:GridItemData){console.log(点击了${item.title})// 这里可以添加导航逻辑}}// 数据模型接口interfaceGridItemData{id:numbertitle:stringicon:Resource color:string}运行效果五、布局方向与对齐方式Grid 支持多种布局方向和对齐方式Grid(){// ... GridItem内容}.layoutDirection(GridDirection.Row)// 按行排列默认// .layoutDirection(GridDirection.Column) // 按列排列.justifyContent(FlexAlign.Start)// 主轴起点对齐// .justifyContent(FlexAlign.Center) // 主轴居中对齐// .justifyContent(FlexAlign.End) // 主轴终点对齐// .justifyContent(FlexAlign.SpaceBetween) // 两端对齐// .justifyContent(FlexAlign.SpaceAround) // 环绕对齐.alignItems(ItemAlign.Start)// 交叉轴起点对齐// .alignItems(ItemAlign.Center) // 交叉轴居中对齐// .alignItems(ItemAlign.End) // 交叉轴终点对齐六、响应式网格布局Grid 组件也支持响应式设计可以根据屏幕尺寸动态调整列数import{display}fromkit.ArkUIEntryComponentstruct ResponsiveGridExample{Statecolumns:string1fr 1fr// 默认2列StatescreenWidth:number0aboutToAppear(){// 根据屏幕宽度动态调整列数constscreenWidthpx2vp(display.getDefaultDisplaySync().width)this.screenWidthscreenWidthif(screenWidth750){this.columns1fr 1fr 1fr 1fr// 大屏4列}elseif(screenWidth400){this.columns1fr 1fr 1fr// 中屏3列}else{this.columns1fr 1fr// 小屏2列}}build(){Column(){Text(屏幕宽度vpthis.screenWidth).fontSize(30)Grid(){ForEach([1,2,3,4,5,6,7,8,9],(item:number){GridItem(){Text(Item${item}).fontSize(16).textAlign(TextAlign.Center)}.height(80)})}.columnsTemplate(this.columns).rowsGap(10).columnsGap(10).width(100%)}}}上述代码在 DevEco Studio 预览器中无法获取到真实的屏幕宽高返回的可能为 0 或默认值。必须在模拟器或真机上运行才能正确获取。模拟器上的运行效果400vp 屏幕宽度 750vp屏幕宽度 750vp七、性能优化建议避免过度嵌套GridItem 内部组件结构尽量简单使用键值优化ForEach 中为动态数据提供稳定的 key懒加载对于大量数据的网格考虑使用 LazyForEach图片优化网格中的图片使用合适的尺寸和缓存策略八、常见问题与解决方案问题1GridItem不显示原因Grid的直接子元素不是GridItem解决确保所有直接子元素都用 GridItem 包裹问题2布局错乱原因columnsTemplate 设置不当解决检查fr单位的使用确保总和合理问题3滚动不流畅原因网格项内容过于复杂解决简化GridItem内部结构使用缓存九、总结Grid 组件是鸿蒙应用开发中实现网格布局的强大工具特别适合九宫格、商品列表等场景。通过合理使用columnsTemplate、rowsTemplate、间距和对齐属性可以创建出既美观又实用的界面布局。核心要点回顾Grid的直接子元素必须是GridItem使用columnsTemplate定义列数和宽度比例通过rowsGap和columnsGap控制间距支持滚动和响应式布局结合ForEach实现动态数据渲染十、进一步学习要深入了解 Grid 组件的更多高级特性建议查阅 官方文档 。通过掌握 Grid 组件您将能够轻松应对各种复杂的网格布局需求提升鸿蒙应用的界面开发效率。

相关新闻

UVa 364 Constitutional Computing

UVa 364 Constitutional Computing

题目描述 美国宪法规定,众议员名额应按各州人口比例分配,且每州至少一名。但由于人口并非除得尽,实际分配必须给每个州一个正整数个席位。本题要求对给定的若干州的人口数和目标总席位数,分别用四种经典分配方法(Hamil…

2026/7/19 17:25:36阅读更多 →
Python 项目配置文件怎么选?ini、json、yaml、toml、py 全对比选型指南

Python 项目配置文件怎么选?ini、json、yaml、toml、py 全对比选型指南

前言 几乎所有 Python 程序都离不开配置:接口地址、数据库账号、超时时间、开关变量、业务参数……很多新手随手写一个全局字典硬编码在代码里,上线改参数就要重新发布,维护极其痛苦。 市面上主流 Python 配置方案有五种:.py 原生…

2026/7/19 17:23:36阅读更多 →
如何为node-jsonc-parser贡献代码:开源项目参与指南

如何为node-jsonc-parser贡献代码:开源项目参与指南

如何为node-jsonc-parser贡献代码:开源项目参与指南 【免费下载链接】node-jsonc-parser Scanner and parser for JSON with comments. 项目地址: https://gitcode.com/gh_mirrors/no/node-jsonc-parser 欢迎来到node-jsonc-parser开源项目贡献指南&#xff…

2026/7/19 17:23:36阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →