大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!
ArkUI提供了各种布局组件用于界面布局,本文研究使用Grid组件实现网格布局。
一、概述
网格布局(Grid)是一种强大的布局方案,它将页面划分为行和列组成的网格,然后将页面内容在二维网格中进行自由的定位,以下效果都可通过网格布局实现
网格布局的容器组件为 Grid,子组件为 GridItem,具体语法如下
代码- Grid() {
- GridItem() {
- Text('GridItem')
- }
- GridItem() {
- Text('GridItem')
- }
- GridItem() {
- Text('GridItem')
- }
- GridItem() {
- Text('GridItem')
- }
- ......
- }
复制代码 效果
二、常用属性
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()
复制代码 效果
说明:
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组件支持横跨几行或者几列,如下图所示
可以使用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()
复制代码 效果:
示例代码
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)
复制代码 效果
示例代码
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)
- }
复制代码 三、计算器案例
使用网格布局实现如下布局效果
示例代码
pages/layout/grid目录,新建CalculatorPage.ets文件《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |