《鸿蒙HarmonyOS 5.0开发教程》基础篇04:线性布局组件

374 阅读4分钟

一、构建布局

开发一个应用程序的页面,首先要考虑的就是页面的排列布局。在 ArkTS 中,页面元素的排列方式,大部分都是通过布局组件来控制的。

官方提供了多种构建布局的方式,例如:

  • 线性布局 (Row/Column)
  • 层叠布局 (Stack)
  • 弹性布局 (Flex)
  • 相对布局 (RelativeContainer)
  • 栅格布局 (GridRow/GridCol)
  • 媒体查询 (@ohos.mediaquery)
  • 创建列表 (List)
  • 创建网格 (Grid/GridItem)
  • 创建轮播 (Swiper)
  • 选项卡 (Tabs)

其中,线性布局是我们在鸿蒙应用开发中最常用的一种布局方式。

二、线性布局组件

线性布局组件有2个,分别是Column和Row,它们都是作为容器组件来使用,区别在于:

  • Column:内部子元素从上往下排列;
  • Row:内部子元素从左往右排列;

说明:在ArkTS中,组件是横向排列还是纵向排列,不是看当前组件自身的特性,而是看父级组件是什么样的布局容器。

基础语法:

build() {
    Column() {
        Row() {
            Column()
            Column()
        }

        Row() {
            Column()
            Column()
        }
    }
}

代码说明:

  • build() 函数内只能有一个根组件,所以通常会用Column或Row来作为页面最外层的根组件;
  • Column和Row之间可以相互嵌套使用;
  • 以上代码中,Column和Row都没有设置样式,因此在预览中暂时看不到任何页面效果;

三、组件样式

我们可以通过“属性方法”的语法形式,来给线性布局组件添加样式。

1、通用属性

通用属性,指的是不仅限于Column和Row组件可以用,其他组件也可以使用。常用的通用属性如下(完整的通用属性可以参考官方文档):

  • width():组件宽度;
  • height():组件高度;
  • size():组件宽高;
  • backgroundColor():组件背景颜色;
  • border():组件边框;
  • padding():组件内边距;
  • margin():组件外边距;

示例代码:

build() {
    Column() {
        Row() {
            Column()
                .width(100).height(100)
                .border({ width: 1, color: 'white' })
                .margin({ left: 50 })
        }
        .size({ width: '100%', height: 200 })
        .backgroundColor('blue')
    }
    .width('100%').height('100%')
    .padding(20)
    .backgroundColor('#eeeeee')
}

代码预览效果如下图:

image-20250115115720827

2、线性布局属性

除了通用的样式属性外,线性布局组件也有一些自己的排列布局属性(详细文档参考官方文档)。

  • space :控制内部子元素之间的间距:
  • justifyContent():内部子元素在主轴(子元素的默认排列方向)上的排列方式;
  • alignItems():内部子元素在交叉轴(与子元素默认排列方向垂直的方向)上的排列方式;

关于主轴和交叉轴的解释,图示如下:

image-20250115121458839

示例代码:

build() {
    Column() {
        Row() {
            Column().width(100).height(50).backgroundColor('white')
        }
        .justifyContent(FlexAlign.Center) // 让内部子元素在父宽度范围内左右居中对齐
        .alignItems(VerticalAlign.Top)    // 让内部子元素在父宽高范围内靠顶部对齐
        .size({ width: '100%', height: 100 })
        .backgroundColor('blue')

        Row()
            .size({ width: '100%', height: 100 })
            .backgroundColor('red')
    }
    .justifyContent(FlexAlign.Center)     // 让内部子元素在父级高度范围内上下居中对齐
    .width('100%').height('100%')
    .backgroundColor('#eeeeee')
}

代码预览效果如下图:

3、属性取值

justifyContent()alignItems() 是线性布局中非常常用的两种样式属性,它们的属性取值都是从ArkTS预设好的枚举值中来获取设置。

具体属性取值如下:

排列方式justifyContent()属性值alignItems()属性值
靠上对齐FlexAlign.StartVerticalAlign.Top
靠下对齐FlexAlign.EndVerticalAlign.Bottom
上下居中对齐FlexAlign.CenterVerticalAlign.Center
靠左对齐FlexAlign.StartHorizontalAlign.Start
考右对齐FlexAlign.EndHorizontalAlign.End
左右居中对齐FlexAlign.CenterHorizontalAlign.Center
相邻元素间距相等,首尾两端靠边FlexAlign.SpaceBetween
相邻元素间距相等,首尾元素边距是相邻元素边距的一半FlexAlign.SpaceAround
所有元素间距都相等FlexAlign.SpaceEvenly

💡💡💡 Tips 小技巧

每一个属性的取值都有很多种可能,我们不用刻意的去记忆这些取值,只需要在属性方法写好后,将鼠标悬停在方法名上,DevEco Studio就会提示我们该属性的取值是哪一种枚举类型:

image-20250115144836371

确定好枚举类型后,只需要在枚举类型代码后再敲一个点.,DevEco Studio就会弹出当前枚举可选的取值:

image-20250115145034455