HarmonyOS鸿蒙Next基础-一次开发多端部署方案(栅格布局GridRow/GridCol和相对布局RelativeContainer)

HarmonyOS鸿蒙Next基础-一次开发多端部署方案(栅格布局GridRow/GridCol和相对布局RelativeContainer)

前言:

本篇介绍响应式布布局中第二篇,响应式布局第一遍媒体查询(mediaquery),这篇包含两个模块知识点:

  • 栅格布局(GridRow/GridCol)
  • 相对布局(RelativeContainer)

这篇重点放在网格布局(GridRow/GridCol)。在响应式布局中,比较常用不同屏幕**(手机,平板,车机平板)**的兼容,一次开发多端部署方案中,它是不可缺少,必须掌握。 **相对布局(RelativeContainer)**作为小伙伴知识储备。

栅格布局(GridRow/GridCol)

如果是前端小伙伴看到栅格布局很容想到Bootstrp。对!鸿蒙的栅格布局和bootstrp在有些相似。所以前端小伙伴就容易理解,应用开发小伙伴不用担心,我会用通俗易懂语言去解释。

子组件

可以包含GridCol子组件。

接口

GridRow(option?: {columns?: number | GridRowColumnOption, gutter?: Length | GutterOption, breakpoints?: BreakPoints, direction?: GridRowDirection})

参数:

参数名 类型 必填 说明
gutter Length | GutterOption 栅格布局间距,x代表水平方向
columns number | GridRowColumnOption 设置布局列数
breakpoints BreakPoints 设置断点值的断点数列以及基于窗口或容器尺寸的相应参照
direction GridRowDirection 栅格布局排列方向

GutterOption

参数名 参数类型 必填 参数描述
x Length | GridRowSizeOption 水平gutter option
y Length | GridRowSizeOption 竖直gutter option

网格系统断点

栅格系统以设备的水平宽度(屏幕密度像素值,单位vp)作为断点依据,定义设备的宽度类型,形成了一套断点规则。开发者可根据需求在不同的断点区间实现不同的页面布局效果。

这里通俗一点的意思讲:就是我们利用breakpoints属性设置vp值,自己个来设置断点。

默认断点将设备宽度分为xs、sm、md、lg四类:

参数名 取值范围(vp) 设备描述
xs [0, 320) 最小宽度类型设备
sm [320, 520) 小宽度类型设备
md [520, 840) 中等宽度类型设备
lg [840, +∞) 大宽度类型设备

但我们可以使用breakpoints自定义修改断点的取值范围, 除上面四个断电外,有增加了两个xl,xxl。整理下表容易查看:

参数名 设备描述
xs 最小宽度类型设备
sm 小宽度类型设备
md 中等宽度类型设备
lg 大宽度类型设备
xl 特大宽度类型设备
xxl 超大宽度类型设备

针对断点位置,开发者根据实际使用场景,通过一个单调递增数组设置。由于breakpoints最多支持六个断点,单调递增数组长度最大为5

表示启用xs、sm、md共3个断点,小于100vp为xs,100vp-200vp为sm,大于200vp为md。

表示启用xs、sm、md、lg、xl共5个断点,小于320vp为xs,320vp-520vp为sm,520vp-840vp为md,840vp-1080vp为lg,大于1080vp为xl。

栅格系统通过监听窗口或容器的尺寸变化进行断点,通过reference设置断点切换参考物。考虑到应用可能以非全屏窗口的形式显示,以应用窗口宽度为参照物更为通用。

案例

上面我们提到了断点可以使用breakpoints来自定义,我们通过案例去理解这个属性; 网格默认列数是12等分列数,通过配置breakpoints将其分成六个区间,在各区间中,每个栅格子元素占用的列数均不同。

@State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
...
GridRow({
  breakpoints: {
    value: ['200vp', '300vp', '400vp', '500vp', '600vp'],
    reference: BreakpointsReference.WindowSize
  }
}) {
   ForEach(this.bgColors, (color, index) => {
     GridCol({
       span: {
         xs: 2, // 在最小宽度类型设备上,栅格子组件占据的栅格容器2列。
         sm: 3, // 在小宽度类型设备上,栅格子组件占据的栅格容器3列。
         md: 4, // 在中等宽度类型设备上,栅格子组件占据的栅格容器4列。
         lg: 6, // 在大宽度类型设备上,栅格子组件占据的栅格容器6列。
         xl: 8, // 在特大宽度类型设备上,栅格子组件占据的栅格容器8列。
         xxl: 12 // 在超大宽度类型设备上,栅格子组件占据的栅格容器12列。
       }
     }) {
       Row() {
         Text(`${index}`)
       }.width("100%").height('50vp')
     }.backgroundColor(color)
   })
}                                                                     

布局的总列数

GridRow中通过columns设置栅格布局的总列数。

上面提到默认网格默认列数是12等分列数,是在columns未设置的情况下,任何单点下,都是12等分。

@State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown,Color.Red, Color.Orange, Color.Yellow, Color.Green];
...
GridRow() {
  ForEach(this.bgColors, (item, index) => {
    GridCol() {
      Row() {
        Text(`${index + 1}`)
      }.width('100%').height('50')
    }.backgroundColor(item)
  })
}           

也可以自己使用columns为自定义值,效果如下:

@State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
@State currentBp: string = 'unknown';
Row() {
  GridRow({ columns: 4 }) {
    ForEach(this.bgColors, (item, index) => {
      GridCol() {
        Row() {
          Text(`${index + 1}`)
        }.width('100%').height('50')
      }.backgroundColor(item)
    })
  }
  .width('100%').height('100%')
  .onBreakpointChange((breakpoint) => {
    this.currentBp = breakpoint
  })
}
.height(160)
.border({ color: Color.Blue, width: 2 })
.width('90%')

Row() {
  GridRow({ columns: 8 }) {
    ForEach(this.bgColors, (item, index) => {
      GridCol() {
        Row() {
          Text(`${index + 1}`)
        }.width('100%').height('50')
      }.backgroundColor(item)
    })
  }
  .width('100%').height('100%')
  .onBreakpointChange((breakpoint) => {
    this.currentBp = breakpoint
  })
}
.height(160)
.border({ color: Color.Blue, width: 2 })
.width('90%')

column还可以在自定义点断点时,设置不同的列数等分:

@State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown]
GridRow({ columns: { sm: 4, md: 8 }, breakpoints: { value: ['200vp', '300vp', '400vp', '500vp', '600vp'] } ) {
  ForEach(this.bgColors, (item, index) => {
    GridCol() {
      Row() {
        Text(`${index + 1}`)
      }.width('100%').height('50')
    }.backgroundColor(item)
  })
}

排列方向和间距

排列方向控制可以利用direction定义,可设置为GridRowDirection.Row(从左往右排列)或GridRowDirection.RowReverse(从右往左排列),效果分别是:

子组件默认从左往右排列

子组件从右往左排列

gutter属性设置子元素在水平和垂直方向的间距

可以看到列间距是20,行间距是50;

子组件GridCol

GridCol是GridRow组件的子组件,它拥有三个属性分别是span(占用列数),offset(偏移列数),order(元素序号),设置属性有两种方式:

  • 传参方式
  • 属性方式

span

子组件占栅格布局的列数,决定了子组件的宽度,默认为1。

当类型为number时,子组件在所有尺寸设备下占用的列数相同

也可以在六种不同尺寸(xs, sm, md, lg, xl, xxl)设备中子组件所占列数设置,各个尺寸下数值可不同。

offset

这里和bootstrp的很像,栅格子组件相对于前一个子组件的偏移列数,默认为0。

当类型为number时,子组件偏移相同列数。

栅格默认分成12列,每一个子组件默认占1列,偏移2列,每个子组件及间距共占3列,一行放四个子组件。

offset也支持六种不同尺寸(xs, sm, md, lg, xl, xxl)设备中子组件所占列数设置,各个尺寸下数值可不同。

order

子组件排列次序

当子组件不设置order或者设置相同的order, 子组件按照代码顺序展示

当子组件设置不同的order时,order较小的组件在前,较大的在后。 当类型为number时,子组件在任何尺寸下排序次序一致。

相对布局(RelativeContainer)

概述:

RelativeContainer为采用相对布局的容器,支持容器内部的子元素设置相对位置关系。子元素支持指定兄弟元素作为锚点,也支持指定父容器作为锚点,基于锚点做相对位置布局。下图是一个RelativeContainer的概念图,图中的虚线表示位置的依赖关系。

子元素并不完全是上图中的依赖关系。比如,Item4可以以Item2为依赖锚点,也可以以RelativeContainer父容器为依赖锚点。

  • 锚点:通过锚点设置当前元素基于哪个元素确定位置
  • 对齐方式:通过对齐方式,设置当前元素是基于锚点的上中下对齐,还是基于锚点的左中右对齐

设置依赖关系

锚点设置

锚点设置是指设置子元素相对于父元素或兄弟元素的位置依赖关系。 在水平方向上,可以设置left、middle、right的锚点。在竖直方向上,可以设置top、center、bottom的锚点。 了明确定义锚点,必须为RelativeContainer及其子元素设置ID,用于指定锚点信息。ID默认为**“container,其余子元素的ID通过id属性设置。未设置ID的子元素在RelativeContainer**中不会显示。

RelativeContainer父组件为锚点,__container__代表父容器的id。

以子元素为锚点。

设置相对于锚点的对齐位置

设置了锚点之后,可以通过align设置相对于锚点的对齐位置。 在水平方向上,对齐位置可以设置为HorizontalAlign.Start、HorizontalAlign.Center、HorizontalAlign.End。

在竖直方向上,对齐位置可以设置为VerticalAlign.Top、VerticalAlign.Center、VerticalAlign.Bottom。

场景实例

相对布局内的子元素相对灵活,只要在RelativeContainer容器内,均可以通过alignRules进行相应的位置移动。

@Entry
@Component
struct Index {
  build() {
    Row() {
      RelativeContainer() {
        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FF3333')
          .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top },  //以父容器为锚点,竖直方向顶头对齐
            middle: { anchor: '__container__', align: HorizontalAlign.Center }  //以父容器为锚点,水平方向居中对齐
          })
          .id('row1')  //设置锚点为row1

        Row() {
          Image($r('app.media.icon'))
        }
        .height(100).width(100)
        .alignRules({
          top: { anchor: 'row1', align: VerticalAlign.Bottom },  //以row1组件为锚点,竖直方向底端对齐
          left: { anchor: 'row1', align: HorizontalAlign.Start }  //以row1组件为锚点,水平方向开头对齐
        })
        .id('row2')  //设置锚点为row2

        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FFCC00')
          .alignRules({
            top: { anchor: 'row2', align: VerticalAlign.Top }
          })
          .id('row3')  //设置锚点为row3

        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FF9966')
          .alignRules({
            top: { anchor: 'row2', align: VerticalAlign.Top },
            left: { anchor: 'row2', align: HorizontalAlign.End },
          })
          .id('row4')  //设置锚点为row4

        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FF66FF')
          .alignRules({
            top: { anchor: 'row2', align: VerticalAlign.Bottom },
            middle: { anchor: 'row2', align: HorizontalAlign.Center }
          })
          .id('row5')  //设置锚点为row5
      }
      .width(300).height(300)
      .border({ width: 2, color: '#6699FF' })
    }
    .height('100%').margin({ left: 30 })
  }
}

总结

到这里我们把栅格布局(GridRow/GridCol)和相对布局(RelativeContainer)介绍完了; 这里重点注意栅格布局,在响应式开发中常用的方案之一,鸿蒙的一次开发多端部署会用到的方案之一。 栅格布局的提供了很高的的灵活行,我们可以领利用breakpoints对不同尺寸的屏幕进行断点操作,从而大大提升我们在多端响应式布局的灵活的操纵性; 栅格布局可以利用colums自定义列数。默认是12。跟bootstrap一样。 相对布局可以让我们对具体的某个元素进行对象定位操作。


更多关于HarmonyOS鸿蒙Next基础-一次开发多端部署方案(栅格布局GridRow/GridCol和相对布局RelativeContainer)的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,一次开发多端部署方案通过栅格布局(GridRow/GridCol)和相对布局(RelativeContainer)实现。栅格布局适用于在不同设备上保持一致的布局结构,通过定义行和列来分配空间。GridRow用于定义行,GridCol用于定义列,开发者可以通过设置不同的属性来适配不同屏幕尺寸。相对布局则允许组件根据其他组件或父容器的位置进行定位,适合复杂布局场景。这两种布局方式结合使用,可以高效实现一次开发多端部署的目标。

更多关于HarmonyOS鸿蒙Next基础-一次开发多端部署方案(栅格布局GridRow/GridCol和相对布局RelativeContainer)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,实现一次开发多端部署的关键在于灵活运用栅格布局(GridRow/GridCol)和相对布局(RelativeContainer)。栅格布局通过定义行和列的网格系统,确保界面在不同设备上自适应;而相对布局则通过控件之间的相对位置关系,实现精确的布局调整。这两种布局方式结合使用,能够有效提升应用的跨平台兼容性和用户体验。

回到顶部