鸿蒙应用开发: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/10/14 12:58:45 阅读更多 →
Go 性能剖析工具链:pprof、trace 与 benchstat 的协同使用实战

Go 性能剖析工具链:pprof、trace 与 benchstat 的协同使用实战

Go 性能剖析工具链:pprof、trace 与 benchstat 的协同使用实战 一、三个工具的定位与分工 Go 有三个核心性能分析工具,各自解决不同层面的问题: pprof:回答"时间花在哪、内存用在哪"。通过采样和堆快照分析 CPU 和内存瓶…

2026/10/12 15:23:17 阅读更多 →
AMD Qwen3.5-9B-w4a16-tao-symgroup-torchao-v0.17.0:终极CPU推理优化指南

AMD Qwen3.5-9B-w4a16-tao-symgroup-torchao-v0.17.0:终极CPU推理优化指南

AMD Qwen3.5-9B-w4a16-tao-symgroup-torchao-v0.17.0:终极CPU推理优化指南 【免费下载链接】Qwen3.5-9B-w4a16-tao-symgroup-torchao-v0.17.0 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Qwen3.5-9B-w4a16-tao-symgroup-torchao-v0.17.0 AMD Qwen3.5…

2026/10/10 2:15:27 阅读更多 →

最新新闻

贷款违约预测实战入门:从数据处理到评分卡全流程解析

贷款违约预测实战入门:从数据处理到评分卡全流程解析

简介:面向零基础金融风控学习者,提供一份基于 Python 的贷款违约预测完整项目,聚焦个人信贷场景中的违约风险识别,适合作为课程设计或期末大作业提交。项目已获导师指导,并得到 97 分高分评价,代码与说明材…

2026/10/14 12:57:57 阅读更多 →
基于Hadoop与用户行为特征感知的智能图书推荐系统实战

基于Hadoop与用户行为特征感知的智能图书推荐系统实战

简介:这份资源是一篇原创学士学位毕业论文,题为《基于Hadoop框架与用户行为特征感知的智能图书推荐系统设计》,面向计算机科学与技术、软件工程等专业的本专科毕业生,以及希望深入理解大数据处理与推荐系统实践的学习者。论文以Ha…

2026/10/14 12:57:57 阅读更多 →
移动机器人地图管理实战:从静态地图到导航可用数据的完整链路

移动机器人地图管理实战:从静态地图到导航可用数据的完整链路

lingbot-map 这个项目名字看起来很小,但实际做起来才发现,它牵扯的工程细节比想象中多得多。简单说,它是一个面向移动机器人的轻量级地图管理模块,解决的是从“一张静态地图文件”到“机器人导航可用的地图数据”之间的一系列问题…

2026/10/14 12:57:57 阅读更多 →
Flutter跨平台开发实践:鸿蒙系统适配与健康APP实现

Flutter跨平台开发实践:鸿蒙系统适配与健康APP实现

1. 项目背景与核心价值 作为一名长期从事跨平台开发的工程师,我最近完成了一个基于Flutter框架的饮食热量查询APP开发项目,目标平台包括鸿蒙系统。这个项目让我深刻体会到Flutter在跨平台开发中的强大优势,特别是在新兴操作系统上的适配能力。…

2026/10/14 12:57:57 阅读更多 →
基于机器学习的口碑商家客流量预测:从数据构造到LightGBM实战

基于机器学习的口碑商家客流量预测:从数据构造到LightGBM实战

简介:基于机器学习的口碑商家客流量预测项目,面向希望掌握回归预测建模与实战流程的机器学习初学者及竞赛玩家。资源提供从数据清洗、特征提取、天气与用户行为分析到模型训练与规则调优的完整代码链路,配套可直接运行的 Python 工程与说明文…

2026/10/14 12:57:57 阅读更多 →
从SLAM建图到自主导航:lingbot-map室内移动机器人实践路线

从SLAM建图到自主导航:lingbot-map室内移动机器人实践路线

如果你只是想让一个轮式机器人动起来,那很多开源框架十分钟就能跑通一个演示程序。但如果你想让它在一栋真实的室内环境里自己认路、自己判断“我现在站在地图的哪个位置”,事情就完全变了味。lingbot-map这个项目,名字拆开看很直白&#xff…

2026/10/14 12:56:57 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →