鸿蒙开发技术之网格布局【华为根技术】

举报
tea_year 发表于 2025/06/16 18:44:46 2025/06/16
【摘要】 概述网格布局是由“行”和“列”分割的单元格所组成,通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力,子组件占比控制能力,是一种重要自适应布局,其使用场景有九宫格图片展示、日历、计算器等。ArkUI提供了 Grid 容器组件和子组件 GridItem ,用于构建网格布局。Grid用于设置网格布局相关参数,GridItem定义子组件相关特征。Grid组件支持使用条件...

概述

网格布局是由“行”和“列”分割的单元格所组成,通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力,子组件占比控制能力,是一种重要自适应布局,其使用场景有九宫格图片展示、日历、计算器等。

ArkUI提供了 Grid 容器组件和子组件 GridItem ,用于构建网格布局。Grid用于设置网格布局相关参数,GridItem定义子组件相关特征。Grid组件支持使用条件渲染、循环渲染、 懒加载 等方式生成子组件。

Grid布局

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-layout-development-create-grid-V5
网格容器,由“行”和“列”分割的单元格所组成,通过指定“项目”所在的单元格做出各种各样的布局。
  • Grid的子组件必须是GridItem
  • GridItem只能有一个唯一的子组件

布局与约束

Grid组件为网格容器,其中容器内各条目对应一个GridItem组件,如下图所示。

 Grid与GridItem组件关系

常用属性

支持通用属性滚动组件通用属性
  • columnsTemplate
设置当前网格布局列的数量
  • rowsTemplate
设置当前网格布局行的数量
  • columnsGap
设置列与列的间距
  • rowsGap
设置行与行的间距

基本语法

注意:
     当设置columnsTemplate属性,Grid宽度为100%, GridItem宽度自适应
     当设置了rowsTemplate属性,Grid高度为100%, GridItem高度自适应

  Grid() {
    GridItem() {
      Text('1')
    }.border({ width: 1, color: '#f00' })
  }
  .border({ width: 1, color: '#f00' })
  .columnsTemplate('1fr 1fr 2fr')  // 设置当前网格布局列的数量  
  // .rowsTemplate('1fr 1fr 2fr')  // 设置当前网格布局行的数量  
  // .columnsGap(10)  // 列间距
  // .rowsGap(10)     // 行间距

案例一 10方格

@Entry
@Component
struct Test {
  @State arr : string[] = ['1','2','3','4','5','6','7','8','9','10']
  build() {
    Column() {
      Text("aa")
      // 默认宽高由内容撑起来
      Grid() {
        ForEach(this.arr,(item:string)=>{
          GridItem() {
            Text(item)
          }
          .border({width:1, color: '#0f0'})
          // 每个网格项目设置宽100,高60
          // 超出屏幕宽度会自动换行
          .width(100)
          .height(60)
        },(item:string)=>item)
      }
      .border({width:1, color: '#f00'})
    }
  }
}

案例二 横向滚动或竖向滚动

只设置columnsTemplate或rowsTemplate时,内容超出容器,会出现滚动效果

Grid(){
}
// 设置当前网格布局行的数量,不设置时默认1行。
.rowsTemplate('1fr')
.rowsTemplate('1fr 1fr')
// 是将父组件分3行,将父组件允许的高分为4等份,
// 第一行占1份,第二行占一份,第三行占2份。
.rowsTemplate('1fr 1fr 2fr')
 

作业

构建可滚动的网格布局
可滚动的网格布局常用在文件管理、购物或视频列表等页面中,如下图所示。在设置Grid的行列数量与占比时,如果仅设置行、列数量与占比中的一个,即仅设置rowsTemplate或仅设置columnsTemplate属性,网格单元按照设置的方向排列,超出Grid显示区域后,Grid拥有可滚动能力。

横向可滚动网格布局

@Entry
@Component
struct Shopping {
  @State services: Array<string> = ['直播', '进口']

  build() {
    Column({ space: 5 }) {
      Grid() {
        ForEach(this.services, (service: string, index) => {
          GridItem() {
          }
          .width('25%')
        }, (service:string):string => service)
      }
      .rowsTemplate('1fr 1fr') // 只设置rowsTemplate属性,当内容超出Grid区域时,可水平滚动。
      .rowsGap(15)
    }
  }
}

控制滚动位置

与新闻列表的返回顶部场景类似,控制滚动位置功能在网格布局中也很常用,例如下图所示日历的翻页功能。

Grid组件初始化时,可以绑定一个 Scroller 对象,用于进行滚动控制,例如通过Scroller对象的 scrollPage 方法进行翻页。

private scroller: Scroller = new Scroller()

在日历页面中,用户在点击“下一页”按钮时,应用响应点击事件,通过指定scrollPage方法的参数next为true,滚动到下一页。

Column({ space: 5 }) {
  Grid(this.scroller) {
  }
  .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr')

  Row({space: 20}) {
    Button('上一页')
      .onClick(() => {
        this.scroller.scrollPage({
          next: false
        })
      })

    Button('下一页')
      .onClick(() => {
        this.scroller.scrollPage({
          next: true
        })
      })
  }
}

总结

网格布局是一种二维布局。Grid组件支持自定义行列数和每行每列尺寸占比、设置子组件横跨几行或者几列,同时提供了垂直和水平布局能力。当网格容器组件尺寸发生变化时,所有子组件以及间距会等比例调整,从而实现网格布局的自适应能力。根据Grid的这些布局能力,可以构建出不同样式的网格布局

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。