Hello!我是小邢哥——13年编程老炮,实战派技术人,平时爱拆解编程技巧、分享副业心得,记录程序员的进阶路,AI时代陪大家一起稳稳向前。

打开手机里的相册APP,九宫格排列的照片整齐有序;点开日历,日期按行按列精准分布;使用计算器时,数字按键方方正正铺满屏幕——这些我们习以为常的界面布局,全靠HarmonyOS 6.0的网格容器(Grid)“撑腰”。

网格布局就像一款灵活的“格子游戏”,用行和列分割出规则的单元格,再把组件“放”进格子里,就能拼出千变万化的界面。今天咱们就从“玩游戏”的角度,吃透Grid的核心玩法。

一、网格布局:本质是场“格子拼图”

提到“网格”,你肯定会想到笔记本上的方格纸、棋盘上的黑白格子,Grid的核心逻辑和它们如出一辙——

Grid容器就是一张“方格纸”,我们可以先规定这张纸要画多少行、多少列,行与行之间留多大缝隙,列与列之间隔多远。

而GridItem就是“拼图块”,每个拼图块可以占一个格子,也能跨多个格子摆放,最终组合成完整的界面。

比如九宫格照片墙,就是把“方格纸”分成3行3列,每个照片作为一个“拼图块”占一个格子,整齐排列后就成型了。

用一段极简代码感受下“3列网格”的魔力,这是最基础的“格子拼图”:

Grid() {
  // 第一个拼图块(格子1)
  GridItem() {
    Text("1")
      .width("100%")
      .height("100%")
      .backgroundColor("#FFE4E1")
      .textAlign(TextAlign.Center)
  }
  // 第二个拼图块(格子2)
  GridItem() {
    Text("2")
      .width("100%")
      .height("100%")
      .backgroundColor("#E0F7FA")
      .textAlign(TextAlign.Center)
  }
  // 第三个拼图块(格子3)
  GridItem() {
    Text("3")
      .width("100%")
      .height("100%")
      .backgroundColor("#F3E5F5")
      .textAlign(TextAlign.Center)
  }
}
// 核心配置:3列等宽,列间距10
.columnsTemplate("1fr 1fr 1fr")
.columnGap(10)
.width("90%")
.height(150)
.margin({ top: 20 })

运行后你会看到:3个彩色方块并排排列,每块宽度相等,中间还留着均匀的缝隙——这就是Grid最基础的“均分布局”能力,也是它比其他布局更擅长“规则排列”的核心原因。

二、核心技能:4个属性玩转“格子规则”

要玩好“格子游戏”,必须掌握4个核心“规则设定”属性,它们分别负责控制“列数”“行数”“行间距”“列间距”,灵活组合就能实现各种布局需求。

1. columnsTemplate:定“列数”和“列宽占比”

这是Grid的“灵魂属性”,用来规定“方格纸”有多少列,以及每列的宽度占比,格式是用空格分隔的“占比单位”,最常用的单位是fr(fraction,比例单位)。

举几个常见配置场景,一看就懂:

  • .columnsTemplate("1fr 1fr 1fr"):3列等宽,每列占总宽度的1/3,适合九宫格、三列商品列表。

  • .columnsTemplate("2fr 1fr"):2列布局,第一列宽度是第二列的2倍,适合“主内容+侧边栏”的界面。

  • .columnsTemplate("1fr 2fr 1fr"):3列布局,中间列宽度是两侧的2倍,适合中间突出的内容展示。

简单说,fr就像“分蛋糕”,总份数是所有fr值相加,每列占对应份数的比例。比如“2fr 1fr”总份数是3,第一列占2份,第二列占1份。

2. rowsTemplate:定“行数”和“行高占比”

和columnsTemplate对应,用来规定“方格纸”的行数和每行的高度占比,格式完全一致,单位也常用fr

比如要做一个2行3列的布局,且第一行高度是第二行的2倍,只需添加:

.rowsTemplate("2fr 1fr")
.rowGap(10)

这里rowGap是行与行之间的缝隙,和下面要讲的columnGap对应,用来控制格子间的间距。

3. rowGap & columnGap:控“格子间距”

这两个属性很简单,分别控制“行与行之间的垂直间距”和“列与列之间的水平间距”,单位可以是px、vp等,作用是让格子布局不拥挤,更有呼吸感。

比如做九宫格时,设置.rowGap(10).columnGap(10),照片之间就会留出10vp的缝隙,不会紧贴在一起,视觉效果更舒适。

三、实战场景:从“九宫格”到“计算器”的万能应用

Grid的“规则排列+灵活占比”特性,让它成为很多场景的“最优解”,这3类经典场景一定要掌握:

1. 九宫格布局:照片/图标墙首选

相册的照片墙、APP的功能图标墙,几乎都是用Grid实现的。核心配置是“3行3列等宽等高”,代码思路如下:

      Grid() {
        // 循环生成9个GridItem(模拟9张照片)
        ForEach(Array.from({ length: 9 }), (n:number, index) => {
          GridItem() {
            Image($r(`app.media.mn`+(index%3+1))) // 模拟照片资源
              .width("100%")
              .height("100%")
              .objectFit(ImageFit.Cover)
              .borderRadius(8)
          }
        })
      }
      .columnsTemplate("1fr 1fr 1fr") // 3列等宽
      .rowsTemplate("1fr 1fr 1fr")    // 3行等高
      .rowsGap(8)
      .columnsGap(8)
      .width("90%")
      .height("90%")

这里用ForEach循环生成9个GridItem,避免重复代码;每张图片都设为“100%父容器大小”,刚好填满格子,再加上圆角和间距,精致感瞬间拉满。

2. 日历布局:复杂行列的精准控制

日历的“星期标题+日期格子”是Grid的典型复杂应用,核心需求是“7列固定(对应星期),行数随月份天数变化”。实现思路如下:

  • 标题行:用一个GridItem包裹“日、一、二...六”的文本,设置.columnsTemplate("1fr 1fr 1fr 1fr 1fr 1fr 1fr"),7列等宽。

  • 日期行:根据当月天数循环生成GridItem,比如31天就生成31个,Grid会自动按“7列一行”的规则换行,无需手动控制行数。

  • 特殊日期:比如今天的日期,只需给对应GridItem设置不同背景色,就能突出显示。

这种“固定列数+动态行数”的模式,正是Grid擅长的场景,比用Row+Column嵌套更简洁高效。

3. 计算器布局:不规则占比的灵活适配

计算器的按键布局是“不规则网格”的代表:数字键是1:1的小格子,“0”键占2个格子,“=”键占1列2行。Grid的“跨列跨行”能力就能轻松实现,核心是给GridItem添加columnSpan(跨列数)和rowSpan(跨行数)属性。

关键代码示例:

@Entry
@Component
struct Test2 {

  build() {
    Column({space:20}) {
      Grid() {
        // 0键:跨2列
        GridItem() { Text("0").textAlign(TextAlign.Center).padding(20) }
        .backgroundColor("#F5F5F5")
        // 小数点键:占1列
        GridItem() { Text(".").textAlign(TextAlign.Center).padding(20)}
        .backgroundColor("#F5F5F5")
        // =键:跨1列2行
        GridItem() { Text("=").textAlign(TextAlign.Center).padding(20) }
        .backgroundColor("#FF9800")
        // 其他数字键...
        ForEach([1,2,3,4,5,6,7,8,9],(n:number,i:number)=>{
          GridItem() { Text(n+"").textAlign(TextAlign.Center).padding(20) }
          .backgroundColor(i%2==0?"#FF9800":"#F5F5F5")
        })
      }
      .columnsTemplate("1fr 1fr 1fr 1fr") // 4列布局
      .columnsGap(5)
      .rowsGap(5)
      .width("90%")
      .height(400)
    }
    .height('100%')
    .width('100%')
  }
}

通过columnSpan和rowSpan,就能让GridItem打破“单个格子”的限制,实现不规则布局,这也是Grid比其他布局更灵活的重要原因。

四、新手避坑:“格子游戏”的4个关键提醒

Grid看似简单,但新手容易在“规则设定”上踩坑,这4个提醒能帮你少走弯路:

  1. columnsTemplate必设,否则布局失效:Grid默认没有列数,不设置columnsTemplate的话,所有GridItem会挤在一行,必须先通过该属性定义列数和占比。

  2. fr单位不与固定单位混用(新手慎试):虽然可以写.columnsTemplate("200px 1fr")(第一列固定200px,第二列占剩余宽度),但新手容易出现适配问题,建议先熟练使用纯fr布局,再尝试混合单位。

  3. GridItem要“填满”格子:如果GridItem的宽高没设为“100%”或不设置宽高,可能会出现“格子内有空隙”的情况,建议给子组件设.width("100%").height("100%"),确保填满格子。

  4. 动态数据用ForEach循环:像九宫格、日历这种需要多个重复GridItem的场景,一定要用ForEach循环生成,避免手写重复代码,提高可维护性。

结语:用“格子思维”搞定规则布局

Grid的核心优势在于“规则性”和“自适应能力”——它把复杂的行列布局拆解成“定义格子+放组件”两个步骤,既保证了界面的整齐有序,又能通过fr单位和跨列跨行实现灵活适配。

如果大家想考取鸿蒙开发者认证的,欢迎加入我的专属考试链接中:https://developer.huawei.com/consumer/cn/training/classDetail/6ce9d5a998724a849ec634f318107d37?type=1?ha_source=hmosclass&ha_sourceId=89000248

记住“Grid是方格纸,GridItem是拼图块,columnsTemplate和rowsTemplate是格子规则”,再结合九宫格、日历等场景多练几次,你会发现:那些看似复杂的规则布局,其实都是“格子游戏”的简单组合。

下次再看到整齐的界面,不妨想一想:“这是不是用Grid拼出来的?”——你离HarmonyOS布局高手又近了一步!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐