当前位置: 首页 > news >正文

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

大家好,我是潘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 组件所占的单元格,其中rowStartrowEnd属性表示当前子组件的起始行号和终点行号,columnStartcolumnEnd属性表示指定当前子组件的起始列号和终点列号。

说明:

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+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!

http://www.rkmt.cn/news/22696.html

相关文章:

  • 完整教程:深入浅出 Redis:从核心原理到运维实战指南一
  • Docker 部署 PHP 全手册
  • VSCode 使用默认profile打开文件
  • 【数据结构】不带表头节点的双向链表的基本操作 - 实践
  • 基于Java+Springboot+Vue开发的新闻管理系统源码+运行步骤
  • Python 将多个DataFrame合并到一个Excel工作表的sheet中有几种方法
  • 2025 涂料供应厂家最新推荐榜:权威品牌测评 + 选购指南,家装工程选品必看
  • 2025 年中走丝线切割源头厂家最新推荐排行榜发布,解读优质厂家技术亮点与选择攻略伺服/高效/自动中走丝线切割厂家推荐
  • 2024浙江省省赛决赛wp
  • 2025年苏州保洁服务公司最新权威推荐榜:专业家政与深度清洁口碑优选,覆盖日常保洁、开荒保洁、深度清洁及企业保洁服务
  • 2025 年快速退火炉优质厂家最新推荐榜单:真空 / 半导体 / 晶圆 / 高温 / 桌面 / 半自动 / 全自动 / 芯片 / 硅片 / RTP 设备企业权威评选
  • Luogu P10027 梦境世界 题解 [ 蓝 ] [ 多维 DP ]
  • winserver文件备份到minio
  • 教你把未分配的磁盘合并到C盘或者D盘?如何把未分配的硬盘空间分配到另一个磁盘?Windows 11,如何将未分配的磁盘分配给 C 盘?怎么把未分配的磁盘合并到d盘
  • 实用指南:VMware挂载Kail Linux
  • OpenCV基础操作与图像处理 - 指南
  • 2025年行业内游乐设施/过山车游乐设施权威榜单厂家-河北天鸿游乐设备
  • 机器学习技术助力美国西海岸地震预警系统升级
  • 2025年市场课桌椅/钢塑课桌椅最新TOP排名厂家-江西华聚智能家具集团有限公司
  • AT 随机做题 I
  • 画图3D真好用 - Gon
  • 高校与某中心共建机器人技术教育项目
  • WordPress维护模式完整指南:手动实现与插件方案
  • 原型链污染学习
  • 重新认识 Golang 中的 json 编解码
  • 关于价值原语与AI元人文构想的对话全记录——DeepSeek研究
  • Pytorch66页实验题
  • uni-app x开发商城系统,商品列表
  • PySimpleGUI 中有没有类似VB的timer组件
  • 向量空间与子空间