鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法

发布于:2025-04-21 ⋅ 阅读:(39) ⋅ 点赞:(0)

本文聚焦于ArkUI的布局实战,三种十分重要的布局,线性布局、弹性布局、层叠布局,在实际开发过程中这几种布局方法都十分常见,下面直接上手

线性布局

垂直布局(Column)

官方文档: 

Column-行列与堆叠-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

 沿垂直方向布局的容器,在此容器中,所有子组件都会沿着垂直方向排列,也就数从上往下排

 参数表:

参数名 类型 必填 说明
space string | number

纵向布局元素垂直方向间距。

从API version 9开始,space为负数或者justifyContent设置为FlexAlign.SpaceBetween、FlexAlign.SpaceAround、FlexAlign.SpaceEvenly时不生效。

默认值:0

单位:vp

说明:

可选值为大于等于0的数字,或者可以转换为数字的字符串。

 代码部分:

在垂直布局中,有两个十分重要的属性:

属性名 功能描述 参数类型 参数说明 默认值
alignItems 设置子组件在水平方向上的对齐 HorizontalAlign 子组件在水平方向上的对齐格式 HorizontalAlign.Center
justifyContent 设置子组件在垂直方向上的对齐 FlexAlign 子组件在垂直方向上的对齐格式 FlexAlign.Start
import { getRandomRGBA } from '../../../Utils'

@Entry
@Component
struct ColumnCase {
  build() {
    NavDestination() {
      Column({ space: 30 }) {
        Text('垂直布局')
          .fontSize(24)
          .fontWeight(FontWeight.Bold)
        Column({ space: 10 }) {
          ForEach(Array.from({ length: 10 }), () => {
            Text()
              .backgroundColor(getRandomRGBA())
              .width(200)
              .height(20)
          })
        }
        .justifyContent(FlexAlign.Center)
        .alignItems(HorizontalAlign.Center)
      }
      .height('100%')
      .width('100%')
    }
  }
}

@Builder
function ColumnCaseBuilder() {
  ColumnCase()
}

  可以看到在背景色部分我使用了一个函数生成随机的颜色,这个函数如下:

// 随机生成rgba颜色
export const getRandomRGBA = () => {
  const r = Math.floor(Math.random() * 256);
  const g = Math.floor(Math.random() * 256);
  const b = Math.floor(Math.random() * 256);
  return `rgba(${r}, ${g}, ${b}, ${1})`;
}

 效果展示:

 

 水平布局(Row)

官方文档:

Row-行列与堆叠-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

沿水平方向布局容器,这个组件中的子组件会沿着水平方向排列,参数表:

参数名 类型 必填 说明
space number | string

横向布局元素间距。

从API version 9开始,space为负数或者justifyContent设置为FlexAlign.SpaceBetween、FlexAlign.SpaceAround、FlexAlign.SpaceEvenly时不生效。

默认值:0,单位vp

说明:

可选值为大于等于0的数字,或者可以转换为数字的字符串。

 代码部分:

在水平布局容器中也有两个十分重要的属性:

属性名 功能描述 参数类型 是否必填 参数说明 默认值
alignItems 设置子组件在垂直方向上的对齐 VerticalAlign 子组件在垂直方向上的对齐格式 VerticalAlign.Center
justifyContent 设置子组件在水平方向上的对齐 FlexAlign 子组件在水平方向上的对齐格式 FlexAlign.Start
import { getRandomRGBA } from '../../../Utils'

@Entry
@Component
struct RowCase {
  build() {
    NavDestination() {
      Column({ space: 30 }) {
        Text('水平布局')
          .fontSize(24)
          .fontWeight(FontWeight.Bold)
        Row({ space: 10 }) {
          ForEach(Array.from({ length: 20 }), () => {
            Text()
              .backgroundColor(getRandomRGBA())
              .width(40)
              .height(200)
          })
        }
        .justifyContent(FlexAlign.Center)
        .alignItems(VerticalAlign.Center)
      }
      .height('100%')
      .width('100%')
    }
  }
}

@Builder
function RowCaseBuilder() {
  RowCase()
}

 效果展示:

 弹性布局(Flex)

官方文档:

Flex-行列与堆叠-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

 Flex是以弹性方式布局子组件的容器组件,提供更加有效的方式对容器内的子元素进行排列、对齐和分配剩余空间,也就是子组件会随着容器宽度的限制而自动换行,不会挤在一块,但是使用的时候需要加上一个参数使用,才能达到换行的效果,就是:

Flex({ wrap: FlexWrap.Wrap }) // 设置这个参数之后才有换行效果

参数表:

名称 类型 必填 说明
direction FlexDirection

子组件在Flex容器上排列的方向,即主轴的方向。

默认值: FlexDirection.Row

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

wrap FlexWrap

Flex容器是单行/列还是多行/列排列。

默认值: FlexWrap.NoWrap

说明:

在多行布局时,通过交叉轴方向,确认新行堆叠方向。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

justifyContent FlexAlign

所有子组件在Flex容器主轴上的对齐格式。

默认值: FlexAlign.Start

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

alignItems ItemAlign

所有子组件在Flex容器交叉轴上的对齐格式。

默认值: ItemAlign.Start

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

alignContent FlexAlign

交叉轴中有额外的空间时,多行内容的对齐方式。仅在wrap为Wrap或WrapReverse下生效。

默认值: FlexAlign.Start

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

space12+ FlexSpaceOptions12+

所有子组件在Flex容器主轴或交叉轴的间距。

默认值: {main:LengthMetrics.px(0), cross:LengthMetrics.px(0)}

space为负数、百分比或者justifyContent设置为FlexAlign.SpaceBetween、FlexAlign.SpaceAround、FlexAlign.SpaceEvenly时不生效。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

 代码部分:

在以下代码中第一个Flex组件没有设置Wrap参数,子组件就会直接默认水平排列,而第二个Flex设置了Wrap参数,子组件就可以自动换行:

import { getRandomRGBA } from '../../../Utils'

@Entry
@Component
struct FlexCase {
  build() {
    NavDestination() {
      Column({ space: 30 }) {
        Text('弹性布局')
          .fontSize(24)
          .fontWeight(FontWeight.Bold)

        Flex() {
          ForEach(Array.from({ length: 10 }), () => {
            Text()
              .backgroundColor(getRandomRGBA())
              .width(60)
              .margin({ right: 20, bottom: 20 })
              .height(30)
          })
        }

        Flex({ wrap: FlexWrap.Wrap }) {
          ForEach(Array.from({ length: 10 }), () => {
            Text()
              .backgroundColor(getRandomRGBA())
              .width(60)
              .margin({ right: 20, bottom: 20 })
              .height(30)
          })
        }
      }
      .height('100%')
      .width('100%')
    }
  }
}

@Builder
function FlexCaseBuilder() {
  FlexCase()
}

 效果展示:

 层叠布局(Stack)

官方文档:

Stack-行列与堆叠-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

 Stack组件中的子组件会堆叠在一起,默认都是居中对齐,遵循后来居上的原则,如果需要设置层级,可给子组件设置zIndex(数字)属性,数字越大,层级越高, 

参数表:

参数名 类型 必填 说明
alignContent Alignment

设置子组件在容器内的对齐方式。

默认值:Alignment.Center

Stack组件设置组件对齐的方式有两种,一种是通过参数设置:

Stack(value?: { alignContent?: Alignment })

第二种是通过属性设置:

Stack(){

// 子组件...

}

.alignContent(Alignment.Center)

 

 两种方式都选一种即可,对齐方式分为九种,如下:

对齐位置 枚举值 说明
左上 Alignment.TopStart 左上角对齐
上边居中 Alignment.Top 上边居中对齐
右上 Alignment.TopEnd 右上角对齐
左边居中 Alignment.Start 左边居中对齐
中心 Alignment.Center 中心对齐
右边居中 Alignment.End 右边居中对齐
左下 Alignment.BottomStart 左下角对齐
下边居中 Alignment.Bottom 下边居中对齐
右下 Alignment.BottomEnd 右下角对齐

如图:

 

  代码部分:

这里一共有三个Stack组件,第一个小图在左上,第二个默认都居中,第三个在右下,一共放了两张图片,一个在占满,一个显示位置

@Entry
@Component
struct StackCase {
  build() {
    NavDestination() {
      Text('层叠布局')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
      Column({ space: 20 }) {
        Stack({ alignContent: Alignment.TopStart }) {
          Image($r('app.media.ark_ui'))
            .width(200)
            .height(200)
          Image($r('app.media.avatar'))
            .width(30)
            .height(30)
        }
        .width(200)
        .height(200)

        Stack() {
          Image($r('app.media.ark_ui'))
            .width(200)
            .height(200)
          Image($r('app.media.avatar'))
            .width(30)
            .height(30)
        }
        .width(200)
        .height(200)

        Stack({ alignContent: Alignment.BottomEnd }) {
          Image($r('app.media.ark_ui'))
            .width(200)
            .height(200)
          Image($r('app.media.avatar'))
            .width(30)
            .height(30)
        }
        .width(200)
        .height(200)
      }
      .height('100%')
      .width('100%')
    }
  }
}

@Builder
function StackCaseBuilder() {
  StackCase()
}

 效果展示:

ArkUI内容持续更新中........


网站公告

今日签到

点亮在社区的每一天
去签到