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



一、引言
在 HarmonyOS NEXT 的 ArkTS 页面开发中,布局是构建用户界面的基石。从传统的 Flex 弹性布局、Column / Row 线性布局,到绝对坐标 Stack 层叠布局,每种布局方式都有其适用的场景。然而,当我们需要精确控制子组件之间的相对位置关系时,RelativeContainer(相对布局容器) 无疑是最直接、最强大的选择。
RelativeContainer 的核心理念非常简单:不为子组件指定固定的 x / y 坐标,而是通过声明式规则告诉每个子组件「你相对于谁、在哪条边上对齐」。这种「规则驱动」而非「坐标驱动」的思路,使得布局天然具备自适应性——当屏幕尺寸、容器大小发生变化时,所有子组件的位置关系自动维持,无需开发者重新计算坐标。
本教程将通过一个完整的可运行示例,带你从零掌握 RelativeContainer 的所有核心概念与实战技巧。
二、RelativeContainer 的核心概念
2.1 什么是相对布局?
传统布局中,我们常通过 position: absolute 加 left / 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(如 top、left、center、middle、bottom、right)表示子组件自身的哪条边需要对齐。
key 的完整取值:
| 自身边 key | 作用 | 对应方向 |
|---|---|---|
top |
子组件的顶边 | 垂直 |
bottom |
子组件的底边 | 垂直 |
left |
子组件的左边 | 水平 |
right |
子组件的右边 | 水平 |
center |
子组件的垂直中轴线 | 垂直 |
middle |
子组件的水平中轴线 | 水平 |
每个 key 对应的 value 是一个对象,包含 anchor 和 align 两个字段:
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 }
})
这个组件声明了「顶边贴容器顶、底边贴容器底、左边贴容器左、右边贴容器右」—— 引擎会推断出:组件的大小 = 容器的大小。如果只声明 top、left 而不声明 bottom、right,则组件使用自己声明的 width / height。
这种「约束求解」的机制使得我们可以创建出极为灵活的布局——一部分边用规则约束,另一部分用固定尺寸,实现「一端固定、一端自适应」的效果(详见示例 4)。
三、API 24 环境搭建与注意事项
3.1 SDK 版本对应关系
HarmonyOS NEXT 从 API 12 开始引入 RelativeContainer,到 API 24(SDK 6.x)时该组件已完全稳定。在 API 24 中:
RelativeContainer是 ArkUI 的内置组件,无需手动 importHorizontalAlign和VerticalAlign也是全局枚举,可直接使用- 如果需要显式导入,路径为
@kit.ArkUI,但内置全局符号的方式更简洁
3.2 项目基础结构
一个使用 RelativeContainer 的页面遵循标准的 ArkTS 组件结构:
@Entry
@Component
struct MyPage {
build() {
RelativeContainer() {
// 子组件在此声明
}
.width('100%')
.height('100%')
}
}
3.3 三个关键规则
使用 RelativeContainer 时请务必牢记:
- 每个子组件都必须有
.id()——即使它不被其他组件引用,因为内部对齐也依赖 id __container__是保留关键字,指向容器自身,不可作为组件的 id.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规则:本组件的水平中线 → 对齐 → 容器的水平中线
「垂直中线对齐」+「水平中线对齐」= 正中央。
注意:
center和middle容易混淆——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 最强大的一面——组件之间的相对定位。B 的 left 边对齐 A 的 End(右边缘),这实现了「B 紧挨着 A 的右侧放置」的效果。
对于 D 来说,它的 top 边对齐 A 的 Bottom(底边缘),同时 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 锚点 │
└──────────────────────────────────────────────┘
技术分析:
这个示例展示了「约束求解」的精髓:
- 左栏:声明了
top、bottom、left三条规则,没有声明right规则 → 引擎使用显式声明的width(80)来确定右边界 - 右栏:声明了
top、bottom、left、right四条规则 → 引擎通过求解约束得出宽度 =容器宽 - 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 条 | 确定位置,尺寸固定 | 必须显式声明 width 和 height(如示例 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 大显身手的实际场景:
- 仪表盘 / 数据面板:多个卡片以不规则方式排列,相互之间有位置依赖
- 视频播放器 UI:播放按钮居中、进度条底部、设置按钮右上角、弹幕输入框左下角
- 地图标注覆盖:标注气泡指向地图上的特定位置,且需要跟随地图平移
- 卡片式布局:卡片右上角显示角标、左下角显示时间标签、底部居中显示按钮
- 画布 / 编辑器:工具栏固定在顶部、属性面板固定在右侧、画布区域填满剩余空间
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 调试建议
当布局效果不符合预期时,建议先:
- 给
RelativeContainer加上.border()或.backgroundColor()—— 确认容器边界 - 给每个子组件加上不同颜色的背景 —— 确认它们的位置和大小
- 逐步减少子组件数量 —— 定位到具体哪个组件的规则有问题
- 在代码中添加注释 —— 标注每个组件的定位意图
九、性能与最佳实践
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 常常与 Column、Row、Flex、Grid 等布局混合使用。一个常见的模式是:
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:参考资料
- HarmonyOS NEXT 官方文档 — RelativeContainer
- HarmonyOS NEXT 官方文档 — alignRules
- HarmonyOS NEXT API 参考(API 24)
本文配套的完整示例代码位于项目 entry/src/main/ets/pages/Index.ets,使用 DevEco Studio 打开并运行即可查看效果。
更多推荐


所有评论(0)