HarmonyOS - 线性布局组件:Row 和 Column

195 阅读3分钟

前言

在搭建页面元素的场景中,最常见的就是线性布局。在 HarmonyOS 中,包含水平线性布局:Row 和垂直线性布局:Column。

在本文中,我们就来看一下 Row 和 Column 的使用方式。

Row

Row 是 HarmonyOS 中的水平线性布局,我们可以用它来包裹组件来实现水平方向的页面。下面是 Row 组件的代码示例:

struct Index {
  build() {
    Row() {
      Text("文本1")
      Text("文本2")
      Button("按钮").onClick((event: ClickEvent) => { })
    }
    .justifyContent(FlexAlign.SpaceBetween)
    .backgroundColor(Color.Gray)
    .height('10%')
    .width('100%')
  }
}

上述代码设置了一个行高为屏幕 10% 高度的水平线性布局,背景色为灰色,里面包含三个子组件,两个文本组件,一个按钮组件。示例图如下:

截屏2025-04-27 19.56.37.png

从上图可以看出,线性布局内的组件是依次进行排放的。如果我们想改变他们的排列方式,可以通过 justifyContent 来进行修改,它支持设计以下几种排列方式:

  • Start:从起始位置排列(默认)。
  • Center:水平方向居中排列。

截屏2025-04-27 19.57.04.png

  • End:从尾部排列。

截屏2025-04-27 19.57.22.png

  • SpaceBetween:第一个组件头部,最后一个组件尾部,中间组件等间距排列。

截屏2025-04-27 19.57.36.png

  • SpaceAround:中间组件等间距排列,第一个组件和最后一个组件的间距为中间组件间距的一半。

截屏2025-04-27 19.57.49.png

  • SpaceEvenly:所有组件等间距。

截屏2025-04-27 19.58.04.png

Row 除了可以设置水平方向的组件排列方式,也支持通过 .alignItems() 设置垂直方向的排列方式,共支持以下三种:

  • Top:垂直方向顶部排列。
  • Center:垂直方向居中排列(默认)。
  • Bottom:垂直方向底部排列。

除了可以设置自适应的排列方式之外,我们也可以通过 space 来设置固定的间距值。

struct Index {
  build() {
    Row({ space: 50 }) {
      Text("文本1")
      Text("文本2")
      Button("按钮").onClick((event: ClickEvent) => {
      })
    }
    .backgroundColor(Color.Gray)
    .height('10%')
    .width('100%')
  }
}

效果图如下: 截屏2025-04-27 20.18.27.png

Column

对于线性布局来讲,有主轴和交叉轴的概念。对于 Row 来说,主轴为水平方向,交叉轴为垂直方向;而对于 Column 来说,则主轴为垂直方向,交叉轴为水平方向。

上述代码例子和示例图给出了可以通过 justifyContent 设置 Row 主轴方向的排列方式;通过 alignItems 可以设置交叉轴的排列方式。对于 Column 则是一模一样的用法,示例代码如下:

struct Index {
  build() {
    Column() {
      Text("文本1")
      Text("文本2")
      Button("按钮").onClick((event: ClickEvent) => {})
    }
    .backgroundColor(Color.Gray)
    .justifyContent(FlexAlign.SpaceBetween)
    .alignItems(HorizontalAlign.Start)
    .height('50%')
    .width('100%')
  }
}

示例图如下:

截屏2025-04-27 20.25.02.png

通过 Blank 实现自适应效果

Blank 组件为空白站位组件,如果设置其宽高则会占据相应大小的位置。在我们日常的开发中,经常会碰到头尾两个组件自适应大小,中间空白填充。这种情况就可以通过 Blank 来实现:

struct Index {
  build() {
    Row() {
      Text("文本1")
      Blank()
      Button("按钮").onClick((event: ClickEvent) => {})
    }
    .backgroundColor(Color.Gray)
    .height('10%')
    .width('100%')
  }
}

通过中间添加一个不设置宽高的 Blank 组件,就可以将两个组件撑到左右边界。示例图如下:

截屏2025-04-27 20.30.46.png

总结

RowColumn 为线性布局组件,可以通过 justifyContent 设置组件的主轴方向的排列方式;通过 alignItems 可以设置组件的交叉轴的排列方式。如果需要固定大小的间距通过 space 实现。