网格布局 Grid/GridItem的基本介绍

134 阅读5分钟

作用:如果布局是由 很多的 行 和 列 所组成、行列可能需要合并、甚至滚动,就可以使用网格布局来实现。

  1. 固定行列数量(不滚动)
  2. 合并行列(不滚动)
  3. 设置滚动
  4. 代码控制滚动
  5. 自定义滚动条

1.固定行列

实现这种固定的行列,不能进行滚动

image.png

语法:

Grid() {
  GridItem(){
    // 展示的内容放在这里
  }
  GridItem(){
    // 展示的内容放在这里
  }
}

注意:

1.Grid的子组件必须是GridItem组件,而且需要展示的内容写在GridItem组件的内部即可,GridItem 只能有一个子组件

2.如果Grid组件设置了宽高属性,则它的尺寸为设置值;如果Grid组件没有设置宽高属性,则默认适应它的父组件的尺寸。

1.1基本属性

image.png

设置在Grid上面的属性有:

  • columnsTemplate列上面的几等分
  • rowsTemplate行上面的几等分 上面两个的参数的类型的string
  • columnsGap列间距
  • rowsGap行间距
@Entry
@Component
struct Index {

//这里运用了@Builder来进行对 GridItem的封装
  @Builder gridItemBuilder(text:string){
    GridItem(){
      Text(text)
    }
    .backgroundColor('#0094ff')
  }

  build() {
    Column(){
      Grid(){
        this.gridItemBuilder('1')
        this.gridItemBuilder('2')
        this.gridItemBuilder('3')
        this.gridItemBuilder('4')
        this.gridItemBuilder('5')
        this.gridItemBuilder('6')
        this.gridItemBuilder('7')
        this.gridItemBuilder('8')
        this.gridItemBuilder('9')
      }
      .width('100%')
      .height(300)
      .backgroundColor(Color.Gray)
      // 1. columnsTemplate+rowsTemplate可以固定几行几列来显示
      .columnsTemplate('1fr 1fr 1fr')//表示三列
      .rowsTemplate('1fr 1fr 1fr')//表示三行
      .columnsGap(5)//列距
      .rowsGap(5)//行距

    }
    .width('100%')
    .height('100%')
    
  }
}

注意:这里columnsTemplate + rowsTemplate可以固定几行几列来显示。如果少了其中一个就会可能变成一个可以滑动的宫格

2.合并行列

如果要实现合并的效果,则需要在GridItem上面设置以下属性:

image.png

image.png

举例:

image.png 合并第2列和第3列,然后在合并第2行和第3行

@Entry
@Component
struct GridPage03 {

//技巧:这里是快速生成十二个数据的方法
  nums: number[] = Array.from({ length: 12 })

  build() {
    Grid() {
    
    //对他进行遍历生成一个四列三行的宫格
      ForEach(this.nums, (item: number, index: number) => {
      
      //这个如果它的index索引号等于2的时候,
      //因为这里是从0开始的,
      //所以显示多少就从那一个数字开始列合并
      //就设置它的.columnStart(3).columnEnd(4)
      //columnStart是设置它的列,
      //其中里面的数字就不能像索引那样数,
      //应该从0是1开始数,所以在显示2的地方就是3
        if (index === 2) {
          GridItem() {
            Text(index + '')
              .fontColor(Color.White)
              .fontSize(30)
          }
          .backgroundColor('#9dc3e6')
          
       //其中里面的数字就不能像索引那样数,
      //应该从0是1开始往列数,所以在显示2的地方就是3
          .columnStart(3)
          .columnEnd(4)
          
          
          
        } else if (index === 3) {
          GridItem() {
            Text(index + '')
              .fontColor(Color.White)
              .fontSize(30)
          }
          .backgroundColor('#9dc3e6')
          
          //这里是跨行合并,更上同理
          //这里注意在合并列过后索引值原来的位置会发生变化
          //.rowStart(2)括号里面的数字要变成从进行行数了,不要在进行列数,合并第2行和第3行
          .rowStart(2)
          .rowEnd(3)
          
          
          
        } else {
          GridItem() {
            Text(index + '')
              .fontColor(Color.White)
              .fontSize(30)
          }
          .backgroundColor('#9dc3e6')
        }

      })
    }
    
    //这里是设置在Gird上面的属性
    .columnsTemplate('1fr 1fr 1fr 1fr')//四列
    .rowsTemplate('1fr 1fr 1fr')//三行
    .width('100%')
    .height(260)
    .rowsGap(10)//行距
    .columnsGap(10)//列距
    .padding(10)
  }
}

结果:

image.png

3.设置其滚动

在日常开发中,会遇到会滚动的网络布局,比如这种:

image.png

设置方式:

  1. 水平滚动:设置的是rowsTemplate,Grid的滚动方向为水平方向。
  2. 垂直滚动:设置的是columnsTemplate,Grid的滚动方向为垂直方向

比如: 要一个三列的滚动网格,就在Grid上面设置 :

.columnsTemplate('1fr 1fr 1fr') // 竖向滚动

如果要一个三行的滚动网格,就在Grid上面设置:

.rowsTemplate('1fr 1fr 1fr') // 横向滚动

注意:要实现对应的滚动效果,这两个属性只能设置其中一个,不然就会变成一个固定的几行几列,而且如果内容太多,单个的小网格还会显示不完整

4.用代码实现其滚动设置其滚动

如图效果:

image.png

步骤:

  1. 创建 Scroller 对象
  2. 设置给 Grid
  3. 调用 Scroller 对象的 scrollPage 方法
// 1.创建 Scroller 对象
scroller: Scroller = new Scroller()

// 2.设置给 Grid
 Grid(this.scroller) {
   // ...
 }

// 3.通过代码控制:next为true为点击下一页,
为false则为点击下一页
this.scroller.scrollPage({
  next:true // 下一页
  next:false // 上一页
})

5.自定义滚动条

如果默认的滚动条外观满足不了要求,则可以进行自定义。

自定义有两种方法:

  1. 使用提供的属性调整(可调整属性有限)
  2. 使用 ScrollBar 组件自定义(可定制性高)

5.1使用属性调整

如果需求只是调整颜色和宽度,或者是关闭滚动条就使用这三个属性在Grid上面进行.出来即可

image.png

5.2使用ScrollBar组件自定义

在上面已经介绍了如何用代码控制滚动

核心步骤:

  1. 和 Grid 共用同一个 Scroller
  2. 创建 ScrollBar 组件并设置属性

注意:记得提前关闭自带的

scrollBar(BarState.Off) // 关闭

//1.创建一个Scroller
scroller: Scroller = new Scroller()

// 和 Grid 共用同一个 Scroller
Grid(this.scroller){
  // 略
}

// 和 Grid 共用同一个 Scroller
// 创建 ScrollBar 组件并设置属性,这里的ScrollBar是一个容器了,不再是Grid上面的一个属性
ScrollBar({
  scroller: this.scroller,
  direction: ScrollBarDirection.Horizontal // 滚动方向
}) {
  // 滚动内容 设置外观即可
  Text()
}
// 设置外观

举例:设置如图效果

image.png

部分代码:

// 自定义滚动条
      ScrollBar({
      //这里scroller必须更Grid绑定的相同
        scroller: this.scroller,
        //水平滚动
        direction: ScrollBarDirection.Horizontal
      }) {
      
      //这里的Text也可以换成Row和Column等相关组件,该部分是橘色的选中时的外观
        Text()
          .width(40)
          .height(20)
          .backgroundColor(Color.Orange)
      }
      
      //这里是整个滚动条的外观
      .width(200)
      .height(20)
      .backgroundColor(Color.Red)