arkUI:网格布局(Grid)
- 1 主要内容说明
- 2 网格布局的相关内容
- 2.1 基本使用
- 2.1.1 源码1 (Grid网格布局)
- 2.1.2 源码1运行效果
- 2.2 设置排列方式
- 2.2.1 核心布局参数
- 2.2.2 网格单元格参数(GridItem)
- 2.2.3 源码2(设置排列方式)
- 2.2.4 源码2运行效果
- 2.3 方向及项数的设置(layoutDirection、maxCount)
- 2.3.1 layoutDirection的内容
- 2.3.2 maxCount的内容
- 2.3.3 源码3(方向及项数的设置)
- 2.3.2 源码3运行效果
- 2.4 滚动效果
- 2.4.1 源码4(滚动效果)
- 2.4.2 源码6运行效果
- 3 结语
- 4 定位日期
1 主要内容说明
网格布局(Grid)是一种将子组件按行列排列的布局方式,适合用来展示规则化、对齐的内容分布。它允许通过行列模板、方向控制等参数,灵活调整子组件的排列方式和显示样式。网格布局是一种强大且灵活的布局工具,特别适合规则性强的内容展示。通过调整模板、方向和显示限制等参数,可以轻松实现不同的排列需求,同时保持布局的美观和一致性。
2 网格布局的相关内容
2.1 基本使用
- Grid组件为网格容器,其中容器内每一个条目对应一个GridItem组件,Grid的子组件必须是GridItem组件。
2.1.1 源码1 (Grid网格布局)
@Entry
@Component
struct PageGrid1 {build() {// 主容器为 Column 布局,整体占满屏幕Column() {// 第一组 Grid 布局Grid() {// 第一格:文字 "枣"GridItem() {Text("枣") // 显示文字“枣”}.backgroundColor("#ffc") // 浅黄色背景.margin(10) // 设置外边距 10px// 第二格:文字 "天龙"GridItem() {Text("天龙") // 显示文字“天龙”}.backgroundColor("#ffc").margin(10)// 第三格:文字 "白芷"GridItem() {Text("白芷") // 显示文字“白芷”}.backgroundColor("#ffc").margin(10)// 第四格:包含多段文字的 Column 布局GridItem() {Column() { // 垂直布局Text("起") // 显示“起”Text("阳") // 显示“阳”Text("草") // 显示“草”}}.backgroundColor("#ffc").margin(10)}// 分割线Divider().color("red") // 红色分割线.height(20) // 高度为 20px// 第二组 Grid 布局Grid() {GridItem() {Text("大枣") // 显示文字“大枣”}.backgroundColor("#ffc").margin(10)GridItem() {Text("天龙") // 显示文字“天龙”}.backgroundColor("#ffc").margin(10)GridItem() {Text("白芷") // 显示文字“白芷”}.backgroundColor("#ffc").margin(10)// 使用 Flex 容器展示文字GridItem() {Flex({ justifyContent: FlexAlign.SpaceBetween }) {Text("起") // 显示“起”Text("阳") // 显示“阳”Text("草") // 显示“草”}}.backgroundColor("#ffc").margin(10)}// 分割线Divider().color("red").height(20)// 第三组 Grid 布局Grid() {GridItem() {Text("大红枣") // 显示文字“大红枣”}.backgroundColor("#ffc").margin(10)GridItem() {Text("天龙") // 显示文字“天龙”}.backgroundColor("#ffc").margin(10)GridItem() {Text("白芷") // 显示文字“白芷”}.backgroundColor("#ffc").margin(10)// 使用 Row 容器展示文字GridItem() {Row({ space: 5 }) { // 横向布局,文字之间间隔 5pxText("起") // 显示“起”Text("阳") // 显示“阳”Text("草") // 显示“草”}}.backgroundColor("#ffc").margin(10)}}.width("100%") // 宽度为屏幕的 100%.height("100%") // 高度为屏幕的 100%}
}
2.1.2 源码1运行效果
2.2 设置排列方式
2.2.1 核心布局参数
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
rowsTemplate | string | 设置每行的高度分布,支持比例值 (fr)、固定值(如 100vp)、自动 (auto) 等。 | “1fr 2fr 1fr” |
columnsTemplate | string | 设置每列的宽度分布,支持同样的单位。 | “1fr 1fr 2fr” |
rowsGap | number | 定义网格行之间的间距(单位:vp)。 | 5 |
columnsGap | number | 定义网格列之间的间距(单位:vp)。 | 10 |
- fr:表示比例单位,1fr 代表可用空间的 1 份。
- 固定值:可以使用固定值(如 100vp)。
- auto:根据内容大小自动调整高度或宽度。
2.2.2 网格单元格参数(GridItem)
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
rowStart | number | 单元格从第几行开始,索引从 0 开始。 | 0 |
rowEnd | number | 单元格在第几行结束(不包括该行)。 | 2 |
columnStart | number | 单元格从第几列开始,索引从 0 开始。 | 1 |
columnEnd | number | 单元格在第几列结束(不包括该列)。 | 3 |
2.2.3 源码2(设置排列方式)
@Entry
@Component
struct PageGrid2 {// 数据数组arr: string[] = ["枣1", "天龙2", "白芷3", "起阳草4", "和事草5", "黄金石6", "丹砂7", "柏8", "丁香9"]build() {// 主容器为 Column 布局Column({ space: 10 }) {// 第一个网格布局Grid() {// 动态生成网格项ForEach(this.arr, (item: string) => {GridItem() {Text(item).backgroundColor("#fcc") // 浅红色背景.width("100%").height("100%").textAlign(TextAlign.Center) // 文字居中}})}.rowsTemplate("1fr 1fr 1fr 1fr") // 四行等高.columnsTemplate("1fr 1fr 1fr") // 三列等宽.width("100%").height(300) // 固定高度.backgroundColor("#ff24f3d4") // 背景色.rowsGap(5) // 行间距.columnsGap(5) // 列间距// 第二个网格布局Grid() {// 动态生成网格项,条件布局ForEach(this.arr, (item: string) => {if (item == "天龙2") {// 特殊处理 "天龙2"GridItem() {Text(item).backgroundColor("#ff29ea52").width("100%").height("100%").textAlign(TextAlign.Center)}.rowStart(0) // 起始行.rowEnd(3) // 结束行} else if (item == "枣1") {// 特殊处理 "枣1"GridItem() {Text(item).backgroundColor("#ff29ea52").width("100%").height("100%").textAlign(TextAlign.Center)}.columnStart(0) // 起始列.columnEnd(1) // 结束列} else {// 默认处理其他项GridItem() {Text(item).backgroundColor("#ff29ea52").width("100%").height("100%").textAlign(TextAlign.Center)}}})}.rowsTemplate("2fr 1fr 1fr 1fr") // 第一行高度加倍.columnsTemplate("1fr 2fr 1fr") // 第二列宽度加倍.width("100%").height(300) // 固定高度.backgroundColor("#ff2659e3") // 背景色.rowsGap(5) // 行间距.columnsGap(5) // 列间距}.height("100%") // 占满父容器高度.width("100%") // 占满父容器宽度}
}
2.2.4 源码2运行效果
2.3 方向及项数的设置(layoutDirection、maxCount)
-
layoutDirection 控制排列方向(按行或列优先,顺序或逆序)。
-
maxCount 限制显示的项数。 通过合理搭配这两个参数,可以灵活实现复杂的网格布局需求。
-
layoutDirection 与 maxCount 的配合:
-------- layoutDirection 决定显示顺序,maxCount 决定显示数量。
-------- 两者结合使用时,layoutDirection 会影响显示的内容范围。 -
结合 rowsTemplate 和 columnsTemplate 使用:
-------- 网格的行列分布会受到模板的定义影响,因此在设置 maxCount 时需要确保模板能容纳足够的项。 -
动态数据场景:
-------- 使用 maxCount 时,数据源的长度可能超过 maxCount,未显示的部分不会影响网格布局的其他配置。
2.3.1 layoutDirection的内容
- 作用:设置网格项的排列方向(从哪个方向开始填充,以及填充的优先级)。
- 类型:GridDirection 枚举。
枚举值 | 说明 |
---|---|
GridDirection.Row | 按行优先排列(默认值)。先填满一行,再填下一行,从左到右。 |
GridDirection.RowReverse | 按行优先逆序排列。从右到左,先填满一行再填下一行。 |
GridDirection.Column | 按列优先排列。先填满一列,再填下一列,从上到下。 |
GridDirection.ColumnReverse | 按列优先逆序排列。从下到上,先填满一列再填下一列。 |
2.3.2 maxCount的内容
- 作用:限制网格中最多显示的网格项数量,超过该数量的项将被隐藏。
- 类型:number。
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
maxCount | number | 无 | 指定网格中最多可显示的项数,超出部分隐藏。 |
2.3.3 源码3(方向及项数的设置)
@Entry
@Component
struct PageGridDirection {// 数据数组arr: string[] = ["枣1", "天龙2", "白芷3", "起阳草4", "和事草5", "黄金石6", "丹砂7", "柏8", "丁香9"]build() {// 主容器:Column 布局,子组件垂直排列Column({ space: 10 }) {// 网格布局Grid() {// 动态生成网格项ForEach(this.arr, (item: string) => {GridItem() {// 每个网格项显示数组中的元素Text(item).backgroundColor("#fcc") // 设置背景色为浅红色.width("20%") // 文本宽度占20%.height("20%") // 文本高度占20%.textAlign(TextAlign.Center) // 文字居中对齐}})}.width("100%") // 网格宽度占满父容器.height(300) // 网格高度固定为 300 vp.backgroundColor("#ff24f3d4") // 网格背景设置为半透明粉色.rowsGap(5) // 网格项之间行间距 5 vp.columnsGap(5) // 网格项之间列间距 5 vp.layoutDirection(GridDirection.RowReverse) // 设置排列方向为“行逆序”.maxCount(3) // 限制最多显示 3 个网格项}.height("100%") // 主容器高度占满父容器.width("100%") // 主容器宽度占满父容器}
}
2.3.2 源码3运行效果
2.4 滚动效果
单独设置rowsTemplate属性值,或单独设置columnsTemplate属性,当内容超出Grid组件宽度时,Grid滚动进行内容展示。
2.4.1 源码4(滚动效果)
@Entry
@Component
struct PageGridDirection {// 数据数组arr: string[] = ["枣1", "天龙2", "白芷3", "起阳草4", "和事草5", "黄金石6", "丹砂7", "柏8", "丁香9"]build() {// 主容器:Column 布局,子组件垂直排列Column({ space: 10 }) {// 网格布局Grid() {// 动态生成网格项ForEach(this.arr, (item: string) => {GridItem() {// 每个网格项显示数组中的元素Text(item).backgroundColor("#fcc") // 设置背景色为浅红色.width(60) // 文本宽度占20%.height(80) // 文本高度占20%.textAlign(TextAlign.Center) // 文字居中对齐}})}.width("100%") // 网格宽度占满父容器.height(300) // 网格高度固定为 300 vp.backgroundColor("#ff24f3d4") // 网格背景设置为半透明粉色.rowsGap(5) // 网格项之间行间距 5 vp.columnsGap(5) // 网格项之间列间距 5 vp.columnsTemplate("1fr 1fr")}.height("100%") // 主容器高度占满父容器.width("100%") // 主容器宽度占满父容器}
}
2.4.2 源码6运行效果
3 结语
使用网格布局编写一个计时器的样式,比使用其他布局编写要容易一些。相册的内容显示,也可以根据需要选择使用网格布局。
由于笔者的能力有限,创作的内容有所不足在所难免,也敬请读者包涵和指出,万分感谢!
4 定位日期
2024-11-18;
21:28;