鸿蒙原生 ArkTS 布局方式之 RelativeContainer 相对布局入门:对齐规则全解析


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、引言

在 HarmonyOS NEXT 的 ArkTS 页面开发中,布局是构建用户界面的基石。从传统的 Flex 弹性布局、Column / Row 线性布局,到绝对坐标 Stack 层叠布局,每种布局方式都有其适用的场景。然而,当我们需要精确控制子组件之间的相对位置关系时,RelativeContainer(相对布局容器) 无疑是最直接、最强大的选择。

RelativeContainer 的核心理念非常简单:不为子组件指定固定的 x / y 坐标,而是通过声明式规则告诉每个子组件「你相对于谁、在哪条边上对齐」。这种「规则驱动」而非「坐标驱动」的思路,使得布局天然具备自适应性——当屏幕尺寸、容器大小发生变化时,所有子组件的位置关系自动维持,无需开发者重新计算坐标。

本教程将通过一个完整的可运行示例,带你从零掌握 RelativeContainer 的所有核心概念与实战技巧。


二、RelativeContainer 的核心概念

2.1 什么是相对布局?

传统布局中,我们常通过 position: absoluteleft / top 数值来定位元素。这种方式的缺陷显而易见:

  • 当容器大小变化时,固定坐标的元素可能跑出边界
  • 当新增或删除元素时,需要手动调整所有相关元素的坐标
  • 在不同屏幕密度和分辨率下,效果无法保证一致性

RelativeContainer 解决了这些问题。它允许你描述「对齐关系」而非「精确位置」:

子组件 A 的左边 → 对齐 → 子组件 B 的右边
子组件 A 的顶边 → 对齐 → 容器顶边

这些关系是声明式的、可组合的,并且是自适应的。

2.2 两大锚点类型

RelativeContainer 中,每个组件的对齐规则都需要指定一个「锚点」(anchor)。锚点有两种类型:

锚点类型 写法 含义
父容器锚点 __container__ 指向当前 RelativeContainer 自身
兄弟组件锚点 'someId' 指向另一个拥有 .id('someId') 的子组件

其中 __container__ 是保留关键字,前后各有两个下划线,表示「当前容器的边界」。

2.3 对齐规则(alignRules)

每个子组件通过 .alignRules() 方法声明一组对齐规则。一个规则由三部分组成:

.alignRules({
  // 自身对齐边: { anchor: 锚点ID, align: 锚点的参考边 }
  top:    { anchor: '__container__', align: VerticalAlign.Top    },
  left:   { anchor: '__container__', align: HorizontalAlign.Start }
})

规则中的 key(如 topleftcentermiddlebottomright)表示子组件自身的哪条边需要对齐。

key 的完整取值:

自身边 key 作用 对应方向
top 子组件的顶边 垂直
bottom 子组件的底边 垂直
left 子组件的左边 水平
right 子组件的右边 水平
center 子组件的垂直中轴线 垂直
middle 子组件的水平中轴线 水平

每个 key 对应的 value 是一个对象,包含 anchoralign 两个字段:

  • anchor:锚点的 .id() 值,或 '__container__'
  • align:锚点上的哪条边作为对齐参考线

align 的取值取决于对齐方向:

水平方向:

HorizontalAlign.Start   → 锚点的左边缘
HorizontalAlign.Center  → 锚点的水平中线
HorizontalAlign.End     → 锚点的右边缘

垂直方向:

VerticalAlign.Top    → 锚点的上边缘
VerticalAlign.Center → 锚点的垂直中线
VerticalAlign.Bottom → 锚点的下边缘

2.4 组合规则与约束求解

当为组件声明了多个对齐规则后,RelativeContainer 的布局引擎会自动求解出组件的位置和尺寸。例如:

.alignRules({
  top:    { anchor: '__container__', align: VerticalAlign.Top    },
  bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
  left:   { anchor: '__container__', align: HorizontalAlign.Start },
  right:  { anchor: '__container__', align: HorizontalAlign.End   }
})

这个组件声明了「顶边贴容器顶、底边贴容器底、左边贴容器左、右边贴容器右」—— 引擎会推断出:组件的大小 = 容器的大小。如果只声明 topleft 而不声明 bottomright,则组件使用自己声明的 width / height

这种「约束求解」的机制使得我们可以创建出极为灵活的布局——一部分边用规则约束,另一部分用固定尺寸,实现「一端固定、一端自适应」的效果(详见示例 4)。


三、API 24 环境搭建与注意事项

3.1 SDK 版本对应关系

HarmonyOS NEXT 从 API 12 开始引入 RelativeContainer,到 API 24(SDK 6.x)时该组件已完全稳定。在 API 24 中:

  • RelativeContainer 是 ArkUI 的内置组件,无需手动 import
  • HorizontalAlignVerticalAlign 也是全局枚举,可直接使用
  • 如果需要显式导入,路径为 @kit.ArkUI,但内置全局符号的方式更简洁

3.2 项目基础结构

一个使用 RelativeContainer 的页面遵循标准的 ArkTS 组件结构:

@Entry
@Component
struct MyPage {
  build() {
    RelativeContainer() {
      // 子组件在此声明
    }
    .width('100%')
    .height('100%')
  }
}

3.3 三个关键规则

使用 RelativeContainer 时请务必牢记:

  1. 每个子组件都必须有 .id()——即使它不被其他组件引用,因为内部对齐也依赖 id
  2. __container__ 是保留关键字,指向容器自身,不可作为组件的 id
  3. .alignRules() 中声明的规则数量决定了组件的自由度——规则越少,组件的尺寸越依赖于显式声明的 width / height

四、实战示例逐层拆解

下面我们通过 5 个从简单到复杂的示例,逐一展示 RelativeContainer 的各项能力。

示例 1:相对于容器居中(最基础用法)

这是最简单的场景——将一段文本固定在容器的正中央。

核心代码:

RelativeContainer() {
  Text('居中')
    .id('centerText')
    .width(80).height(40)
    .alignRules({
      center: { anchor: '__container__', align: VerticalAlign.Center },
      middle: { anchor: '__container__', align: HorizontalAlign.Center }
    })
}

图解:

┌─────────────────────────────┐
│                             │
│                             │
│          ┌────────┐         │
│          │  居中   │         │
│          └────────┘         │
│                             │
│                             │
└─────────────────────────────┘

关键点解析:

  • center 规则:本组件的垂直中线 → 对齐 → 容器的垂直中线
  • middle 规则:本组件的水平中线 → 对齐 → 容器的水平中线

「垂直中线对齐」+「水平中线对齐」= 正中央。

注意: centermiddle 容易混淆——center 控制垂直方向(上下居中),middle 控制水平方向(左右居中)。可以借助英文联想记忆:center 是「中心点」偏竖直概念,middle 是「中间位置」偏水平概念。

示例 2:四角 + 居中(多子组件协作)

这个示例在同一个容器中放置 5 个组件,分别固定在左上、右上、左下、右下和正中。

四角落点定位规则:

组件 定位规则 逻辑
左上 top + left 顶边贴容器顶 + 左边贴容器左
右上 top + right 顶边贴容器顶 + 右边贴容器右
左下 bottom + left 底边贴容器底 + 左边贴容器左
右下 bottom + right 底边贴容器底 + 右边贴容器右

图解:

┌─────────────────────────────────┐
│ ┌──────┐              ┌──────┐ │
│ │ 左↑上 │              │ 右↑上 │ │
│ └──────┘              └──────┘ │
│                                 │
│            ┌──────┐            │
│            │  居中 │            │
│            └──────┘            │
│                                 │
│ ┌──────┐              ┌──────┐ │
│ │ 左↓下 │              │ 右↓下 │ │
│ └──────┘              └──────┘ │
└─────────────────────────────────┘

实战技巧:

这个模式在很多 UI 场景中都有直接应用:卡片上的角标、提示气泡的定位、游戏 UI 的血条和按钮分布等。通过调整规则中的 align 值,还可以实现「离角落有一定偏移」的效果——例如将 left 改为 HorizontalAlign.Center 并配合偏移属性 offset

值得注意的是,同一个容器中可以有多个组件引用 __container__ 作为锚点,它们之间互不冲突,各自按规则定位。

示例 3:相对兄弟组件定位(链式排列)

这个示例演示了如何让组件相对于另一个组件进行定位,而非总是相对于容器。

布局逻辑:

A (固定在左上角) → B (紧贴 A 右侧) → C (紧贴 B 右侧)
D (换行,在 A 下方) → E (紧贴 D 右侧)

核心代码片段:

// A —— 锚定容器左上角
Text('A')
  .id('itemA')
  .alignRules({
    top:  { anchor: '__container__', align: VerticalAlign.Top },
    left: { anchor: '__container__', align: HorizontalAlign.Start }
  })

// B —— 锚定 A 的右上角
Text('B')
  .id('itemB')
  .alignRules({
    top:   { anchor: 'itemA', align: VerticalAlign.Top },
    left:  { anchor: 'itemA', align: HorizontalAlign.End }
  })

// C —— 锚定 B 的右上角
Text('C')
  .id('itemC')
  .alignRules({
    top:   { anchor: 'itemB', align: VerticalAlign.Top },
    left:  { anchor: 'itemB', align: HorizontalAlign.End }
  })

// D —— 换行:锚定 A 的左下角
Text('D')
  .id('itemD')
  .alignRules({
    top:   { anchor: 'itemA', align: VerticalAlign.Bottom },
    left:  { anchor: '__container__', align: HorizontalAlign.Start }
  })

图解:

┌─────────────────────────────────────┐
│ ┌───┐ ┌───┐ ┌───┐                   │
│ │ A │ │ B │ │ C │                   │
│ └───┘ └───┘ └───┘                   │
│ ┌───┐ ┌───┐                          │
│ │ D │ │ E │                          │
│ └───┘ └───┘                          │
│                                      │
└─────────────────────────────────────┘

关键洞察:

这是 RelativeContainer 最强大的一面——组件之间的相对定位Bleft 边对齐 AEnd(右边缘),这实现了「B 紧挨着 A 的右侧放置」的效果。

对于 D 来说,它的 top 边对齐 ABottom(底边缘),同时 left 边对齐容器的 Start(左边缘),实现了「换行回到左边」的效果。

这种链式布局在实际开发中非常有用——标签列表、导航面包屑、流式排列的图标等。

注意事项: 使用兄弟组件锚定时,必须保证被引用的组件(锚点组件)在布局中先被求解RelativeContainer 的布局引擎会自动处理依赖顺序,但如果锚点形成一个循环依赖(A 依赖 B,B 依赖 A),会导致布局错误。务必保持引用关系为有向无环图(DAG)。

示例 4:左右分栏(一端固定,一端自适应)

这是最常见的双栏布局场景——左栏固定宽度,右栏占据剩余空间。

核心代码:

RelativeContainer() {
  // 左栏:固定宽 80,三边固定
  Text('左栏\n固定宽 80')
    .id('leftPanel')
    .width(80)
    .alignRules({
      top:    { anchor: '__container__', align: VerticalAlign.Top    },
      bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
      left:   { anchor: '__container__', align: HorizontalAlign.Start }
    })

  // 右栏:自适应宽度,四边全约束
  Text('右栏\n自适应宽度')
    .id('rightPanel')
    .alignRules({
      top:    { anchor: '__container__', align: VerticalAlign.Top    },
      bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
      left:   { anchor: 'leftPanel',   align: HorizontalAlign.End    },
      right:  { anchor: '__container__', align: HorizontalAlign.End   }
    })
}

图解:

┌──────────────────────────────────────────────┐
│ ┌──────────────┐                              │
│ │ 左栏         │  右栏(自适应宽度)           │
│ │ 固定宽 80    │                              │
│ │              │                              │
│ └──────────────┘                              │
│     ↑ leftPanel.End   ↑ __container__.End      │
│     作为 rightPanel   作为 rightPanel          │
│     的 left 锚点       的 right 锚点           │
└──────────────────────────────────────────────┘

技术分析:

这个示例展示了「约束求解」的精髓:

  • 左栏:声明了 topbottomleft 三条规则,没有声明 right 规则 → 引擎使用显式声明的 width(80) 来确定右边界
  • 右栏:声明了 topbottomleftright 四条规则 → 引擎通过求解约束得出宽度 = 容器宽 - 80

当容器宽度变化时,右栏自动伸缩,左栏保持不变。这正是响应式 UI 的核心能力。

示例 5:四边贴边对齐(边缘色带)

最后一个示例将四条色带分别固定在容器的上、左、右、下四个边缘,形成「画框」效果。

核心代码片段:

// 顶边色带:top + left + right(水平撑满)
Text('top 贴顶')
  .id('stripTop')
  .height(24)
  .alignRules({
    top:   { anchor: '__container__', align: VerticalAlign.Top    },
    left:  { anchor: '__container__', align: HorizontalAlign.Start },
    right: { anchor: '__container__', align: HorizontalAlign.End   }
  })

// 左边色带:top + bottom + left(垂直撑满)
Text('left 贴左')
  .id('stripLeft')
  .width(50)
  .alignRules({
    top:    { anchor: '__container__', align: VerticalAlign.Top    },
    bottom: { anchor: '__container__', align: VerticalAlign.Bottom  },
    left:   { anchor: '__container__', align: HorizontalAlign.Start }
  })

图解:

┌──────────────────────────────────────────────────┐
│ ┌────────────────────────────────────────────┐   │
│ │               top 贴顶                      │   │
│ ├───────┬──────────────────────────┬──────────┤   │
│ │left   │   四条色带分别             │  right   │   │
│ │贴左   │   贴住四边                │  贴右    │   │
│ │       │                          │          │   │
│ ├───────┴──────────────────────────┴──────────┤   │
│ │              bottom 贴底                      │   │
│ └────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────┘

布局思维要点:

这里三条色带(顶、左、右)相互覆盖了边缘区域,RelativeContainer 会根据子组件的声明顺序处理层叠——后声明的组件在上层。通过调整声明顺序,可以控制哪个色带「压」在另一个上面。

这种「画框」布局模式在设计页面框架时非常有用:顶部导航栏 + 底部工具栏 + 左侧侧边栏 + 右侧面板 + 内容区域。


五、alignRules 完整参考表

为了让你在编码时快速查阅,这里给出所有 alignRules 键值与 HorizontalAlign / VerticalAlign 枚举值的完整对照表。

5.1 对齐方向与枚举值

方向 枚举 值含义
水平 HorizontalAlign.Start 锚点区域的左边缘
水平 HorizontalAlign.Center 锚点区域的水平中线
水平 HorizontalAlign.End 锚点区域的右边缘
垂直 VerticalAlign.Top 锚点区域的上边缘
垂直 VerticalAlign.Center 锚点区域的垂直中线
垂直 VerticalAlign.Bottom 锚点区域的下边缘

5.2 常见对齐组合速查

效果 alignRules
左上角 top:__container__.Top + left:__container__.Start
右上角 top:__container__.Top + right:__container__.End
左下角 bottom:__container__.Bottom + left:__container__.Start
右下角 bottom:__container__.Bottom + right:__container__.End
正中央 center:__container__.Center + middle:__container__.Center
顶部居中 top:__container__.Top + middle:__container__.Center
底部居中 bottom:__container__.Bottom + middle:__container__.Center
左侧居中 center:__container__.Center + left:__container__.Start
右侧居中 center:__container__.Center + right:__container__.End
撑满全屏 top + bottom + left + right 全部指向 __container__

5.3 约束规则数量与自由度

声明的规则数 自由度 典型行为
0–1 条 未充分约束 组件位置不确定,一般不使用
2 条 确定位置,尺寸固定 必须显式声明 widthheight(如示例 1)
3 条 一个方向撑满 另一个方向尺寸由显式值决定(如示例 4 左栏)
4 条 完全约束,自适应 尺寸由容器和其他锚点推导(如示例 4 右栏)

六、RelativeContainer vs 其他布局容器

了解 RelativeContainer 的独特定位,有助于在真实项目中做出正确的布局选择。

6.1 与 Column / Row 对比

维度 Column / Row RelativeContainer
布局方向 单一方向(仅水平或垂直) 任意方向,全二维
子组件关系 顺序排列,线性 自由锚定,可重叠
自适应能力 通过 flex 参数 通过约束求解
适用场景 列表、表单、导航栏 复杂面板、仪表盘、游戏 UI

选型建议: 如果布局是「一维的、顺序的」,优先选择 Column / Row;如果布局是「二维的、不规则排列的」,选择 RelativeContainer

6.2 与 Stack 对比

维度 Stack RelativeContainer
定位方式 position 属性 + 绝对/相对坐标 声明式对齐规则
层叠控制 zIndex 控制层级 声明顺序控制层叠
坐标单位 百分比或 vp 锚点对齐(无单位感)
适配性 坐标固定 → 不易适配 规则驱动 → 天然适配

选型建议: Stack 适合「我要精确知道这个按钮在 x=50, y=100 的位置」的场景;RelativeContainer 适合「这个按钮要始终在容器的右下角」的场景。

6.3 与 Flex 对比

Flex 弹性布局擅长处理「未知数量的子元素等间距分布」,而 RelativeContainer 擅长处理「已知的有限数量的子元素有特定位置关系」。两者在复杂布局中常常配合使用。


七、实战场景与进阶技巧

7.1 应用场景列举

以下是 RelativeContainer 大显身手的实际场景:

  1. 仪表盘 / 数据面板:多个卡片以不规则方式排列,相互之间有位置依赖
  2. 视频播放器 UI:播放按钮居中、进度条底部、设置按钮右上角、弹幕输入框左下角
  3. 地图标注覆盖:标注气泡指向地图上的特定位置,且需要跟随地图平移
  4. 卡片式布局:卡片右上角显示角标、左下角显示时间标签、底部居中显示按钮
  5. 画布 / 编辑器:工具栏固定在顶部、属性面板固定在右侧、画布区域填满剩余空间

7.2 进阶技巧一:配合 offset 实现精调

有时对齐规则无法实现「正好偏移 5vp」的效果,此时可以组合使用 .offset()

Text('偏移示例')
  .id('offsetDemo')
  .alignRules({
    top:   { anchor: '__container__', align: VerticalAlign.Top },
    right: { anchor: '__container__', align: HorizontalAlign.End }
  })
  .offset({ x: -10, y: 10 })  // 向左偏移 10vp,向下偏移 10vp

这相当于「先按照规则定位,再施加一个固定偏移」,非常适合微调场景。

7.3 进阶技巧二:百分比尺寸与对齐结合

当子组件的尺寸使用百分比时,这些百分比是相对于 RelativeContainer 的:

RelativeContainer() {
  Text('半宽')
    .id('halfWidth')
    .width('50%')
    .height(40)
    .alignRules({
      top:    { anchor: '__container__', align: VerticalAlign.Top    },
      left:   { anchor: '__container__', align: HorizontalAlign.Start }
    })
}

百分比宽度 + 约束定位,让布局更加灵活。

7.4 进阶技巧三:嵌套 RelativeContainer

复杂 UI 可以通过嵌套多个 RelativeContainer 来实现层次化管理:

RelativeContainer() {
  // 外层容器:管理大的区域划分
  Text('顶部区域').id('topArea')
    .alignRules({ ... })

  // 内层容器:处理顶部区域内部的复杂排列
  RelativeContainer() {
    Text('子项1').id('sub1')
      .alignRules({ ... })
    Text('子项2').id('sub2')
      .alignRules({ ... })
  }
  .id('innerContainer')
  .alignRules({
    top:  { anchor: 'topArea', align: VerticalAlign.Bottom },
    left: { anchor: '__container__', align: HorizontalAlign.Start }
  })
}

这种嵌套方式将布局责任分解到不同层级的容器中,代码更加清晰可维护。

7.5 进阶技巧四:动画与过渡

RelativeContainer 中的子组件支持动画过渡。当组件的 alignRules 发生变化时,可以通过 animateTo 实现平滑移动:

@State isExpanded: boolean = false;

// 在事件中切换状态
this.isExpanded = !this.isExpanded;
animateTo({ duration: 300 }, () => {
  // 状态变化会自动触发 rebuild,组件会根据新的 alignRules 重新定位
})

这在实现折叠面板、展开菜单等效果时非常实用。


八、常见错误与调试指南

8.1 错误一:忘记设置 .id()

症状: 组件不显示或者位置不正确
原因: RelativeContainer 依赖 .id() 来管理子组件,没有 id 的组件无法参与约束求解
修复: 为每个子组件添加唯一的 .id()

8.2 错误二:alignRules 中拼写错误

症状: ArkTS 编译器报错或运行时布局异常
原因: key 名 center / middle / left / right 是字符串常量,拼写错误不会触发类型检查
修复: 对照官方文档检查 key 名的拼写

8.3 错误三:循环依赖

症状: 运行时死循环或布局不一致
原因: A 引用 B,B 引用 A,引擎无法求解
修复: 确保锚点引用关系是 DAG(有向无环图)

8.4 错误四:引用了不存在的 id

症状: 编译警告或运行时组件消失
原因: alignRules 中的 anchor 指向了一个不存在的 .id()
修复: 检查所有锚点引用是否与子组件的 .id() 严格匹配

8.5 调试建议

当布局效果不符合预期时,建议先:

  1. RelativeContainer 加上 .border().backgroundColor() —— 确认容器边界
  2. 给每个子组件加上不同颜色的背景 —— 确认它们的位置和大小
  3. 逐步减少子组件数量 —— 定位到具体哪个组件的规则有问题
  4. 在代码中添加注释 —— 标注每个组件的定位意图

九、性能与最佳实践

9.1 性能表现

RelativeContainer 的约束求解算法经过优化,即使在包含 20–30 个子组件的场景下也能保持流畅。对于超过 50 个组件的复杂布局,建议:

  • 优先使用 ForEach 循环生成重复结构的子组件
  • 避免过深的嵌套(超过 5 层)
  • 尽量减少运行时动态修改 alignRules 的频率

9.2 编码风格建议

为了代码的可维护性,推荐以下编码规范:

// ✅ 推荐的编码风格:规则清晰,注释完整
RelativeContainer() {
  Text('用户头像')
    .id('avatar')
    .width(48).height(48)
    .borderRadius(24)
    .alignRules({
      // 固定在容器左上角,偏移 12vp
      top:   { anchor: '__container__', align: VerticalAlign.Top    },
      left:  { anchor: '__container__', align: HorizontalAlign.Start }
    })
    .offset({ x: 12, y: 12 })

  // 多条规则按字母顺序排列,便于快速定位
  Text('用户名')
    .id('userName')
    .alignRules({
      left:  { anchor: 'avatar', align: HorizontalAlign.End   },
      top:   { anchor: 'avatar', align: VerticalAlign.Top     }
    })
}
// ❌ 不推荐的编码风格:规则混乱,缺少 id
RelativeContainer() {
  Text('内容')
    // 没有 id!对齐规则会失效
    .alignRules({
      middle: { anchor: '__container__', align: HorizontalAlign.Center },
      center: { anchor: '__container__', align: VerticalAlign.Center }
    })
}

9.3 与其他布局的混合使用

在实际项目中,RelativeContainer 常常与 ColumnRowFlexGrid 等布局混合使用。一个常见的模式是:

RelativeContainer (大框架)
├── 顶栏 (Column / Row)
├── 内容区 (RelativeContainer 或 Grid)
└── 底栏 (Row)

这种「相对布局管框架,其他布局管内部」的思路,能够充分发挥每种布局的优势。


十、总结

通过本文的 5 个层层递进的示例,我们完整地探索了 RelativeContainer 相对布局在 HarmonyOS NEXT API 24 上的全部核心能力:

示例 核心知识点 实际应用映射
示例 1 center + middle + __container__ 启动页 Logo、加载动画
示例 2 top / bottom / left / right 四边规则 角标、标签定位
示例 3 兄弟组件 .id() 作为锚点、链式引用 标签列表、导航路径
示例 4 约束求解、自适应宽度 分栏布局、侧边栏
示例 5 多规则组合撑满、边缘色带 导航栏、工具栏、页面框架

RelativeContainer 的核心哲学可以概括为一句话:声明位置关系,而非声明位置数值。这种「关系驱动」的布局方式,是构建自适应、可维护 UI 的关键一步。

在实际的开发中,当你需要精确定位少量已知组件,并且希望 UI 能够优雅地适配不同屏幕尺寸时,RelativeContainer 应该是你的首选方案。它将复杂的位置计算抽象为清晰的声明式规则,让你可以专注于「组件之间应该是什么关系」而非「组件应该在哪里」。


附录 A:完整示例代码

完整的可运行代码已在项目 entry/src/main/ets/pages/Index.ets 中提供。你可以直接在 DevEco Studio 中打开项目,连接模拟器或真机运行,直观查看每个示例的效果。

运行后的页面从上到下依次展示 5 个示例,每个示例都使用灰色边框标示出 RelativeContainer 的边界范围,方便观察子组件的定位结果。


附录 B:参考资料


本文配套的完整示例代码位于项目 entry/src/main/ets/pages/Index.ets,使用 DevEco Studio 打开并运行即可查看效果。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐