尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

鸿蒙应用开发从入门到实战(二十四):一文搞懂ArkUI网格布局

鸿蒙应用开发从入门到实战(二十四):一文搞懂ArkUI网格布局
📅 发布时间:2026/6/20 17:04:32
ArkUI提供了各种布局组件用于界面布局,本文研究使用Grid组件实现网格布局。

大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!

ArkUI提供了各种布局组件用于界面布局,本文研究使用Grid组件实现网格布局。

一、概述

网格布局(Grid)是一种强大的布局方案,它将页面划分为行和列组成的网格,然后将页面内容在二维网格中进行自由的定位,以下效果都可通过网格布局实现

1网格布局案例

网格布局的容器组件为 Grid,子组件为 GridItem,具体语法如下

代码

Grid() {GridItem() {Text('GridItem')   }GridItem() {Text('GridItem')   }GridItem() {Text('GridItem')   }GridItem() {Text('GridItem')   }......
}

效果
2网格布局

二、常用属性

2.1 划分网格

Grid组件支持自定义行数和列数以及每行和每列的尺寸大小,上述内容需要使用rowsTemplate()方法和columnsTemplate()方法进行设置,具体用法如下

代码

Grid() {ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9], (item) => {GridItem() {Text(item.toString()).itemTextStyle()}})
}
.width(320)
.height(240)
.rowsTemplate('1fr 1fr 1fr')
.columnsTemplate('1fr 2fr 1fr')
.gridStyle()

效果

3grid划分网格

说明:

fr为 fraction(比例、分数) 的缩写。fr的个数表示网格布局的行数或列数,fr前面的数值大小,表示该行或列的尺寸占比。

示例代码

pages/layout目录下新建grid目录,新建GridBasic.ets文件

@Entry
@Component
struct GridBasic {build() {Column() {Grid() {ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9], (item) => {GridItem() {Text(item.toString()).itemTextStyle12()}})}.width(320).height(240).rowsTemplate('1fr 1fr 1fr').columnsTemplate('1fr 2fr 1fr').gridStyle12()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle12() {.height('100%').width('100%').textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Grid) function gridStyle12() {.backgroundColor('#f5f5f5').borderWidth(1)
}

2.2 子组件所占行列数

GridItem组件支持横跨几行或者几列,如下图所示

4子组件所占行列数

可以使用columnStart()、columnEnd()、rowStart()和rowEnd()方法设置 GridItem 组件所占的单元格,其中rowStart和rowEnd属性表示当前子组件的起始行号和终点行号,columnStart和columnEnd属性表示指定当前子组件的起始列号和终点列号。

说明:

Grid容器中的行号和列号均从0开始。

具体用法如下

代码:

Grid() {GridItem() {Text('1').itemTextStyle()}.rowStart(0).rowEnd(1).columnStart(0).columnEnd(1)GridItem() {Text('2').itemTextStyle()}GridItem() {Text('3').itemTextStyle()}GridItem() {Text('4').itemTextStyle()}GridItem() {Text('5').itemTextStyle()}.columnStart(1).columnEnd(2)
}
.width(320)
.height(240)
.rowsTemplate('1fr 1fr 1fr')
.columnsTemplate('1fr 2fr 1fr')
.gridStyle()

效果:
5grid案例

示例代码

pages/layout/grid目录,新建StartAndEndPage.ets文件

@Entry
@Component
struct StartAndEndPage {build() {Column() {Grid() {GridItem() {Text('1').itemTextStyle13()}.rowStart(0).rowEnd(1).columnStart(0).columnEnd(1)GridItem() {Text('2').itemTextStyle13()}GridItem() {Text('3').itemTextStyle13()}GridItem() {Text('4').itemTextStyle13()}GridItem() {Text('5').itemTextStyle13()}.columnStart(1).columnEnd(2)}.width(320).height(240).rowsTemplate('1fr 1fr 1fr').columnsTemplate('1fr 2fr 1fr').gridStyle13()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle13() {.height('100%').width('100%').textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Grid) function gridStyle13() {.backgroundColor('#f5f5f5').borderWidth(1)
}

2.3 行列间距

使用rowsGap()和columnsGap()属性,可以控制行列间距,具体用法如下

代码

Grid() {......
}
.columnsGap(20)
.rowsGap(20)

效果

6行列间距

示例代码

pages/layout/grid目录,新建GridGap.ets文件

@Entry
@Component
struct GridGap {build() {Column() {Grid() {GridItem() {Text('1').itemTextStyle14()}.rowStart(0).rowEnd(1).columnStart(0).columnEnd(1)GridItem() {Text('2').itemTextStyle14()}.rowStart(0).rowEnd(1)GridItem() {Text('3').itemTextStyle14()}GridItem() {Text('4').itemTextStyle14()}.columnStart(1).columnEnd(2)}.width(320).height(240).rowsTemplate('1fr 1fr 1fr').columnsTemplate('1fr 2fr 1fr').gridStyle14().rowsGap(20).columnsGap(20)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle14() {.height('100%').width('100%').textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Grid) function gridStyle14() {.backgroundColor('#f5f5f5').borderWidth(1)
}

三、计算器案例

使用网格布局实现如下布局效果

7计算器案例

示例代码

pages/layout/grid目录,新建CalculatorPage.ets文件

@Entry
@Component
struct CalculatorPage {build() {Column() {Grid() {GridItem() {Text('0').screenTextStyle()}.columnStart(0).columnEnd(3)GridItem() {Text('CE').buttonTextStyle()}GridItem() {Text('C').buttonTextStyle()}GridItem() {Text('÷').buttonTextStyle()}GridItem() {Text('x').buttonTextStyle()}GridItem() {Text('7').buttonTextStyle()}GridItem() {Text('8').buttonTextStyle()}GridItem() {Text('9').buttonTextStyle()}GridItem() {Text('-').buttonTextStyle()}GridItem() {Text('4').buttonTextStyle()}GridItem() {Text('5').buttonTextStyle()}GridItem() {Text('6').buttonTextStyle()}GridItem() {Text('+').buttonTextStyle()}GridItem() {Text('1').buttonTextStyle()}GridItem() {Text('2').buttonTextStyle()}GridItem() {Text('3').buttonTextStyle()}GridItem() {Text('=').buttonTextStyle().backgroundColor('#1aa1e2')}.rowStart(4).rowEnd(5)GridItem() {Text('0').buttonTextStyle()}.columnStart(0).columnEnd(1)GridItem() {Text('.').buttonTextStyle()}}.gridStyle15().rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr').columnsTemplate('1fr 1fr 1fr 1fr')}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function screenTextStyle() {.backgroundColor('#bac8d3').height('100%').width('100%').textAlign(TextAlign.End).padding(10).borderRadius(10).borderWidth(1).fontSize(40).fontWeight(FontWeight.Bold)
}@Extend(Text) function buttonTextStyle() {.backgroundColor('#f5f5f5').height('100%').width('100%').textAlign(TextAlign.Center).padding(10).borderRadius(10).borderWidth(1).fontSize(25)
}@Extend(Grid) function gridStyle15() {.width(320).height(480).borderRadius(10).borderWidth(1).padding(10).rowsGap(10).columnsGap(10)
}

《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!


作者:黑马腾云
微信公众账号:自学帮
博客园:黑马腾云博客
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注微信公众号)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关新闻

  • 完整教程:深入浅出 Redis:从核心原理到运维实战指南一
  • Docker 部署 PHP 全手册
  • VSCode 使用默认profile打开文件

最新新闻

  • 通过引入大模型来处理图片文件
  • 2026广州优选律师盘点|深耕刑辩/商事/家事,广东本土优质律师事务所实力详解 - 资讯速览
  • 深入解析MAC7200 eSCI与eMIOS:嵌入式通信与定时控制实战
  • NXP Vybrid异构双核MCU实战:Cortex-A5+M4架构解析与嵌入式系统设计
  • FigmaToCode终极指南:将设计秒变生产级代码的完整方案
  • 嵌入式GUI颜色管理:从逻辑颜色到物理显示的emWin实战指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号