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

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

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

2026/7/19 17:25:44 阅读更多 →
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/7/20 21:32:04 阅读更多 →

最新新闻

RPCS3模拟器版本更新导致GT5兼容性问题解析

RPCS3模拟器版本更新导致GT5兼容性问题解析

1. 模拟器玩家遭遇的版本灾难 上周RPCS3模拟器更新到142版本后,整个GT5玩家社区炸开了锅。作为PS3平台最经典的赛车游戏之一,《Gran Turismo 5》在最新版模拟器中出现了灾难性的兼容性问题——游戏启动后要么直接黑屏崩溃,就算勉强进入游戏也…

2026/7/21 3:21:49 阅读更多 →
使用Trae+DeepSeek开发股票K线图网站实战

使用Trae+DeepSeek开发股票K线图网站实战

1. 项目背景与核心价值股票K线图是金融投资领域最基础也最重要的技术分析工具之一。对于个人投资者和量化交易开发者而言,能够自主搭建一个实时展示股票K线图的网站,意味着可以完全掌控数据源、自定义分析指标,并实现个性化的交易策略可视化。…

2026/7/21 3:21:49 阅读更多 →
Cocos Creator 3D入门实战:从环境搭建到多平台发布全流程指南

Cocos Creator 3D入门实战:从环境搭建到多平台发布全流程指南

1. 项目概述:为什么选择Cocos Creator 3D?如果你对游戏开发感兴趣,尤其是想从2D转向3D,或者想找一个上手快、生态成熟、又能跨平台发布的引擎,那么Cocos Creator 3D大概率会进入你的视野。我最初接触它,是因…

2026/7/21 3:21:49 阅读更多 →
LangChain与LangGraph:智能体开发新范式解析

LangChain与LangGraph:智能体开发新范式解析

1. Vibe Coding 与智能体开发新范式在2024年的AI应用开发领域,Vibe Coding正成为一种革命性的开发范式。这种开发方式强调通过自然语言交互和可视化工具快速构建AI应用,大幅降低了智能体开发的门槛。作为从业者,我亲历了从传统编码到Vibe Cod…

2026/7/21 3:21:49 阅读更多 →
苏州湿地别墅市场分析与核心价值解读

苏州湿地别墅市场分析与核心价值解读

1. 苏州别墅市场现状与需求分析苏州作为长三角核心城市之一,其高端住宅市场近年来呈现出明显的差异化发展趋势。根据最新市场调研数据显示,2023年苏州别墅类产品成交均价达到4.8万元/㎡,同比上涨12%,其中独栋别墅占比35%&#xff…

2026/7/21 3:21:49 阅读更多 →
英语易混词辨析:credible与creditable的用法区别

英语易混词辨析:credible与creditable的用法区别

1. 英语易混词辨析:credible与creditable的核心差异作为英语学习过程中常见的易混淆词汇,credible和creditable的拼写相似度高达80%,这让不少英语学习者(包括我在初学阶段)经常用错。这两个词都源自拉丁语词根"cr…

2026/7/21 3:20:49 阅读更多 →

日新闻

Octane Render与C4D汉化版安装与优化指南

Octane Render与C4D汉化版安装与优化指南

1. Octane Render与C4D的黄金组合:为什么选择这个方案?在三维创作领域,渲染器的选择往往决定了作品的最终呈现质量和工作效率。作为Cinema 4D(C4D)用户,Octane Render的GPU加速特性与实时预览功能&#xff…

2026/7/21 0:00:19 阅读更多 →
GPMC接口设计:异步/同步模式与多路复用配置实战

GPMC接口设计:异步/同步模式与多路复用配置实战

1. GPMC接口设计:从硬件连接到软件配置的全局视角在嵌入式系统开发中,尤其是基于TI Sitara系列如AM263x这类高性能微控制器的项目里,外部存储器的扩展几乎是绕不开的一环。无论是存放大量非易失性代码的NOR Flash,还是作为高速数据…

2026/7/21 0:00:19 阅读更多 →
UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

1. 项目概述:UE5 GAS RPG被动技能的核心价值在UE5里用GAS(Gameplay Ability System)做RPG游戏,主动技能像是你手里的武器,按一下打一下,逻辑直接,反馈也快。但被动技能,它更像是你身…

2026/7/21 0:00:19 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/20 5:56:42 阅读更多 →

月新闻