ArkTS 对齐方式总结

一、Alignment 枚举(对齐方式)

1.1 基本对齐方式

对齐方式说明使用场景
Alignment.TopStart顶部起始端对齐左上角对齐
Alignment.Top顶部居中对齐顶部中心
Alignment.TopEnd顶部末端对齐右上角对齐
Alignment.Start垂直居中,起始端对齐左侧居中
Alignment.Center水平垂直居中正中心
Alignment.End垂直居中,末端对齐右侧居中
Alignment.BottomStart底部起始端对齐左下角对齐
Alignment.Bottom底部居中对齐底部中心
Alignment.BottomEnd底部末端对齐右下角对齐

1.2 九宫格示意图

TopStart        Top        TopEnd
   ┌─────────────────────────┐
   │ •           •         • │
   │                         │
Start│ •           •         • │End
   │                         │
   │ •           •         • │
   └─────────────────────────┘
BottomStart   Bottom   BottomEnd

二、常用容器组件的对齐属性

2.1 Stack 堆叠容器

Stack({ alignContent: Alignment.TopEnd }) {
  Text('内容1')
  Text('内容2')
}

特点:

  • 子组件按照添加顺序依次堆叠
  • alignContent 控制所有子组件的对齐方式
  • 后添加的组件会覆盖在上层

2.2 Column 垂直布局

Column() {
  Text('item1')
  Text('item2')
}
.alignItems(HorizontalAlign.Start)  // 水平对齐
.justifyContent(FlexAlign.Center)   // 垂直对齐

HorizontalAlign(水平对齐):

  • HorizontalAlign.Start - 左对齐
  • HorizontalAlign.Center - 居中对齐
  • HorizontalAlign.End - 右对齐

FlexAlign(垂直排列):

  • FlexAlign.Start - 顶部对齐
  • FlexAlign.Center - 居中对齐
  • FlexAlign.End - 底部对齐
  • FlexAlign.SpaceBetween - 两端对齐,中间等间距
  • FlexAlign.SpaceAround - 每个元素周围等间距
  • FlexAlign.SpaceEvenly - 元素间隔相等

2.3 Row 水平布局

Row() {
  Text('item1')
  Text('item2')
}
.alignItems(VerticalAlign.Top)     // 垂直对齐
.justifyContent(FlexAlign.Center)  // 水平对齐

VerticalAlign(垂直对齐):

  • VerticalAlign.Top - 顶部对齐
  • VerticalAlign.Center - 居中对齐
  • VerticalAlign.Bottom - 底部对齐

2.4 Flex 弹性布局

Flex({
  direction: FlexDirection.Row,     // 布局方向
  justifyContent: FlexAlign.Center, // 主轴对齐
  alignItems: ItemAlign.Center      // 交叉轴对齐
}) {
  Text('item1')
  Text('item2')
}

ItemAlign(交叉轴对齐):

  • ItemAlign.Auto - 自动
  • ItemAlign.Start - 起始端对齐
  • ItemAlign.Center - 居中对齐
  • ItemAlign.End - 末端对齐
  • ItemAlign.Stretch - 拉伸填充
  • ItemAlign.Baseline - 基线对齐

三、单个组件的对齐属性

3.1 通用对齐属性

Text("示例文本")
  .width(200)
  .height(100)
  .textAlign(TextAlign.Center) // 文本对齐
  .align(Alignment.Center); // 组件在父容器中的对齐

3.2 TextAlign(文本对齐)

  • TextAlign.Start - 文本左对齐
  • TextAlign.Center - 文本居中
  • TextAlign.End - 文本右对齐

四、实际应用示例

4.1 顶部右侧"跳过"按钮

Stack({ alignContent: Alignment.TopEnd }) {
  Image($r('app.media.ad'))
    .width('100%')
    .height('100%')

  Button('跳过')
    .margin(15)
}

4.2 登录页面居中布局

Column() {
  Image($r('app.media.logo'))
    .width(100)
    .height(100)

  TextInput({ placeholder: '请输入用户名' })
    .width('80%')
    .margin({ top: 20 })

  TextInput({ placeholder: '请输入密码' })
    .width('80%')
    .margin({ top: 10 })

  Button('登录')
    .width('80%')
    .margin({ top: 20 })
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)  // 垂直居中
.alignItems(HorizontalAlign.Center) // 水平居中

4.3 底部导航栏

Row() {
  ForEach(['首页', '发现', '我的'], (item: string) => {
    Column() {
      Image($r('app.media.icon'))
        .width(24)
        .height(24)
      Text(item)
        .fontSize(12)
    }
    .layoutWeight(1)
    .alignItems(HorizontalAlign.Center)
  })
}
.width('100%')
.height(60)
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.SpaceAround)
.backgroundColor(Color.White)

4.4 卡片布局(左图右文)

Row() {
  Image($r('app.media.cover'))
    .width(80)
    .height(80)
    .borderRadius(8)

  Column() {
    Text('歌曲名称')
      .fontSize(16)
      .fontWeight(FontWeight.Bold)

    Text('歌手名称')
      .fontSize(14)
      .fontColor(Color.Gray)
      .margin({ top: 5 })
  }
  .margin({ left: 15 })
  .alignItems(HorizontalAlign.Start)
  .justifyContent(FlexAlign.Center)
  .layoutWeight(1)
}
.width('100%')
.padding(15)
.alignItems(VerticalAlign.Center)

五、重点注意事项

5.1 容器与子组件的关系

  • Stack: 使用 alignContent 控制所有子组件对齐
  • Column/Row: 使用 alignItems 和 justifyContent 分别控制交叉轴和主轴对齐
  • 单个组件: 使用 .align() 控制在父容器中的位置

5.2 优先级规则

  1. 子组件的 .align() 优先级 > 父容器的 alignContent
  2. 使用 layoutWeight 的组件会自动填充剩余空间
  3. position() 绝对定位会脱离正常布局流

5.3 常见组合

需求实现方式
水平垂直居中Column().justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)
底部对齐Column().justifyContent(FlexAlign.End)
两端对齐Row().justifyContent(FlexAlign.SpaceBetween)
右上角定位Stack({ alignContent: Alignment.TopEnd })
等分布局使用 .layoutWeight(1)

六、调试技巧

// 添加边框查看实际布局范围
.border({ width: 1, color: Color.Red })

// 添加背景色区分不同区域
.backgroundColor('#FFE0E0E0')

// 查看占用空间
.width('100%')
.height('100%')

七、性能优化建议

  1. 避免过度嵌套: 尽量使用 Flex 或 Row/Column 替代多层嵌套
  2. 合理使用 layoutWeight: 代替固定宽度,提高响应式布局能力
  3. 使用相对单位: 如 %、vp 而非固定像素
  4. 避免频繁计算: 将对齐相关属性提前确定,避免在循环中计算

参考资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐