HarmonyOS ArkUI 按钮组均匀间距布局技术详解


HarmonyOS ArkUI 按钮组均匀间距布局技术详解
——基于 Row + FlexAlign + Blank 实现自适应间距排列
适用版本:HarmonyOS NEXT (API 24)
技术栈:ArkTS + ArkUI
核心组件:Row、Column、Blank、FlexAlign、JustifyContent
关键词:空间分布、自适应布局、操作面板、按钮组
一、引言
1.1 背景与问题
在移动端应用开发中,按钮组(Button Group)的排列布局是一个极其常见但又容易被忽视的基础需求。无论是底部的操作栏、顶部的工具栏、弹窗中的确认取消按钮,还是表单中的提交重置按钮,都涉及到多个按钮在同一行内如何合理地分布空间。
传统的布局方式往往采用固定间距(margin/padding)或固定宽度百分比,但这些方式存在明显的局限性:
- 固定间距:在不同屏幕尺寸下,按钮组要么挤在一起,要么间距过大
- 固定宽度百分比:按钮数量变化时需要重新计算,且无法灵活控制每个按钮的权重
- 嵌套容器:通过多层容器嵌套实现间距控制,导致布局层级过深,影响性能
HarmonyOS ArkUI 提供了一套强大的线性布局系统,通过 Row + FlexAlign + Blank 的组合,可以优雅地解决上述所有问题。
1.2 核心思路
本文的核心思路是:利用 Row 容器的主轴对齐方式(FlexAlign)和弹性空白填充组件(Blank),实现按钮组的动态均匀间距排列。这套方案不仅代码简洁、性能优异,而且天然支持自适应和响应式。
二、基础概念与组件详解
2.1 Row 容器组件
Row 是 ArkUI 中最基础的线性布局容器之一,负责在水平方向上排列子组件。
2.1.1 基本语法
Row(options?: RowOptions)
其中 RowOptions 是一个可选参数对象,主要包含:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| space | number | string | 否 | 子组件之间的水平间距,默认值 0,单位 vp |
2.1.2 使用示例
Row({ space: 12 }) {
Button('确认')
Button('取消')
Button('重置')
}
当设置 space 参数时,相邻子组件之间会产生固定的间距。需要注意的是,space 参数在 justifyContent 被设置为 FlexAlign.SpaceBetween、FlexAlign.SpaceAround 或 FlexAlign.SpaceEvenly 时不生效——因为此时间距由对齐方式统一管理。
2.1.3 Row 的核心属性
Row 提供以下关键属性来精细控制子组件的排列:
| 属性 | 类型 | 描述 |
|---|---|---|
| justifyContent | FlexAlign | 主轴(水平方向)对齐方式 |
| alignItems | VerticalAlign | 交叉轴(垂直方向)对齐方式 |
| alignSelf | ItemAlign | 子组件自身的交叉轴对齐(覆盖父容器设置) |
2.2 FlexAlign 枚举详解
FlexAlign 是 ArkUI 中用于控制 Flex 布局主轴对齐方式的枚举,也是 justifyContent 属性的取值来源。
2.2.1 枚举值总览
| 枚举值 | 行为描述 | 图示效果 |
|---|---|---|
FlexAlign.Start |
子组件从主轴起点开始排列 | [子1][子2][子3]… |
FlexAlign.Center |
子组件在主轴上居中排列 | …[子1][子2][子3]… |
FlexAlign.End |
子组件从主轴终点开始排列 | …[子1][子2][子3] |
FlexAlign.SpaceBetween |
首尾贴边,中间均分间距 | [子1]…[子2]…[子3] |
FlexAlign.SpaceAround |
每个项目两侧间距相等 | …[子1]…[子2]…[子3]… |
FlexAlign.SpaceEvenly |
所有间距(含首尾)完全相等 | …[子1]…[子2]…[子3]… |
注意:在 API 24 中,
JustifyContent枚举已被FlexAlign完全取代。旧版代码中可能使用JustifyContent.SpaceAround,但在 HarmonyOS NEXT 中必须使用FlexAlign.SpaceAround。
2.2.2 三种均匀分布模式的数学对比
假设容器的总宽度为 W,有 n 个子组件,每个子组件的宽度为 w_i,则:
SpaceBetween(首尾贴边,中间均分):
首尾间距 = 0
中间间距 = (W - Σw_i) / (n - 1)
SpaceAround(每个项目两侧间距相等):
两侧间距 = (W - Σw_i) / (2n)
中间间距 = (W - Σw_i) / n
SpaceEvenly(所有间距完全相等):
所有间距 = (W - Σw_i) / (n + 1)
这三种模式分别适用于不同的场景:
- SpaceBetween:适合需要最大化利用空间、首尾元素需要对齐边缘的场景(如工具栏)
- SpaceAround:适合视觉上均匀分布、但首尾留有一定边距的场景(如操作面板)
- SpaceEvenly:适合所有间距绝对相等的场景(如导航指示器)
2.3 Blank 组件——Flutter Spacer 的 ArkUI 等价物
Blank 组件是 ArkUI 中的弹性空白填充组件,在容器主轴方向上具有自动填充容器剩余空间的能力。它的行为与 Flutter 中的 Spacer 组件完全等价。
2.3.1 基本语法
Blank(min?: number | string)
min 参数指定 Blank 组件的最小宽度(或高度),当容器剩余空间小于此值时,Blank 会保持此最小值而非继续压缩。
2.3.2 Blank 的核心属性
| 属性 | 类型 | 描述 |
|---|---|---|
| color | ResourceColor | 设置空白填充的颜色,默认透明 |
2.3.3 使用限制
- Blank 仅当父组件为 Row、Column 或 Flex 时生效
- 如果父容器未设置主轴方向的大小,Blank 将自动拉伸或压缩
- Blank 在父容器交叉轴上不设置大小时,默认
alignSelf值为ItemAlign.Stretch,会撑满父容器交叉轴
2.3.4 与 FlexAlign 的配合使用
Blank 和 FlexAlign 都可以控制间距,但它们的适用场景不同:
| 维度 | FlexAlign 系列 | Blank 组件 |
|---|---|---|
| 间距类型 | 整体均匀分布 | 局部弹性分隔 |
| 控制粒度 | 全局统一 | 可差异化 |
| 典型场景 | 工具栏、导航栏 | 左中右布局、权重分配 |
| 与 space 参数 | 互斥 | 可共存 |
三、六种布局方法的深度剖析
3.1 方法一:Row + SpaceAround(均匀环绕间距)
核心代码:
Row() {
Button('按钮 1')
Button('按钮 2')
Button('按钮 3')
Button('按钮 4')
}
.width('100%')
.justifyContent(FlexAlign.SpaceAround)
布局效果:每个按钮两侧的间距相等,整体在容器中居中分布,首尾与边缘的距离是相邻按钮间距的一半。
数学原理:
- 假设容器宽度 360vp,按钮宽度 70vp×4 = 280vp
- 剩余空间 = 360 - 280 = 80vp
- 每个单元间距 = 80 / 4 = 20vp
- 首尾间距 = 20 / 2 = 10vp
适用场景:底部操作栏、功能图标面板、标签页导航。
优缺点:
- ✅ 视觉平衡,首尾有自然留白
- ✅ 适合 3-5 个按钮的均匀布局
- ❌ 首尾间距是中间间距的一半,在某些场景下可能不均匀
3.2 方法二:Row + SpaceBetween(两端对齐)
核心代码:
Row() {
Button('按钮 1')
Button('按钮 2')
Button('按钮 3')
Button('按钮 4')
}
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
布局效果:第一个按钮贴左边缘,最后一个按钮贴右边缘,中间按钮均匀分布。
数学原理:
- 假设容器宽度 360vp,按钮宽度 70vp×4 = 280vp
- 剩余空间 = 360 - 280 = 80vp
- 中间间距 = 80 / 3 ≈ 26.67vp
- 首尾间距 = 0vp
适用场景:浏览器的地址栏(后退/前进/刷新/菜单)、分页导航。
优缺点:
- ✅ 最大化利用水平空间,无浪费
- ✅ 首尾自然对齐边缘,视觉上更"满"
- ❌ 首尾没有留白,可能显得拥挤
3.3 方法三:Row + SpaceEvenly(完全均分)
核心代码:
Row() {
Button('按钮 1')
Button('按钮 2')
Button('按钮 3')
Button('按钮 4')
}
.width('100%')
.justifyContent(FlexAlign.SpaceEvenly)
布局效果:所有间距(包括首尾与边缘之间)完全相等,是最"数学公平"的分布方式。
数学原理:
- 假设容器宽度 360vp,按钮宽度 70vp×4 = 280vp
- 剩余空间 = 360 - 280 = 80vp
- 所有间距 = 80 / 5 = 16vp
适用场景:导航圆点指示器、步骤条、平分排列的图标组。
优缺点:
- ✅ 间距完全一致,视觉上最整齐
- ✅ 适合等权重元素的排列
- ❌ 首尾间距与中间间距相同,在宽容器中首尾可能显得空旷
3.4 三种均匀分布模式的对比总结
| 特性 | SpaceBetween | SpaceAround | SpaceEvenly |
|---|---|---|---|
| 首尾间距 | 0 | 中间间距的一半 | = 中间间距 |
| 空间利用率 | 最高 | 中等 | 较低 |
| 适用按钮数 | 不限 | 2-5 个 | 不限 |
| 视觉特征 | 两端顶满 | 自然居中 | 绝对均匀 |
| 典型场景 | 工具栏 | 操作面板 | 指示器 |
3.5 方法四:Blank 模拟 Flutter Spacer
核心代码:
Row() {
Button('左')
Blank() // 弹性撑开
Button('中')
Blank() // 弹性撑开
Button('右')
}
.width('100%')
布局效果:三个按钮之间通过 Blank() 弹性撑开,"左"在左边,"中"在中间,"右"在右边。如果有多个 Blank,它们会均分剩余空间。
核心原理:
Blank()会占据 Row 中未被其他子组件占用的所有剩余空间- 多个
Blank()会等分剩余空间 - 如果某个
Blank设置了min参数,它会保持最小尺寸
适用场景:
- 左中右三栏布局
- 标题 + 操作按钮的导航栏
- 表单中的标签 + 输入框 + 校验图标
与 FlexAlign 的对比:
// 使用 SpaceBetween
Row().justifyContent(FlexAlign.SpaceBetween) {
Button('左')
Button('中')
Button('右')
}
// 使用 Blank(效果等价)
Row() {
Button('左')
Blank()
Button('中')
Blank()
Button('右')
}
这两种方式在只有三个元素时效果相同,但 Blank 提供了更大的灵活性——你可以控制不同位置的 Blank 有不同的权重。
3.6 方法五:Blank 弹性比例分配
核心代码:
Row() {
Button('小')
Blank() // 权重 1
Button('大')
Blank() // 权重 1(在 ArkUI 中 Blank 默认等分)
Button('小')
}
.width('100%')
关于权重分配的实现:
在 ArkUI 中,Blank 组件默认在所有 Blank 之间等分剩余空间。如果需要实现不等比例分配(如 1:2:1),可以利用 layoutWeight 属性或者嵌套布局来实现。
// 利用 layoutWeight 实现比例分配
Row() {
Row() { Blank() }.layoutWeight(1) // 占 1 份
Button('大')
Row() { Blank() }.layoutWeight(2) // 占 2 份
Button('大')
Row() { Blank() }.layoutWeight(1) // 占 1 份
}
适用场景:
- 搜索框 + 按钮的复合布局
- 表单中的标签宽度自适应
- 需要精细化控制间距权重的页面
优缺点:
- ✅ 最灵活,可以实现任意比例的间距分配
- ✅ 不受按钮数量限制
- ❌ 比使用 FlexAlign 稍显复杂
- ❌ 过多 Blank 会增加布局层级
3.7 方法六:动态按钮个数演示
核心代码:
Row() {
ForEach(this.getButtonArray(), (item: number, index: number) => {
this.createButton('Btn' + (index + 1))
}, (item: number) => item.toString())
}
.width('100%')
.justifyContent(FlexAlign.SpaceAround)
核心价值:这是本文最重要的实践之一——动态数量的按钮组。在实际项目中,按钮的数量往往是动态的(根据用户权限、设备状态、功能开关等因素决定),而 FlexAlign.SpaceAround 和 Blank 都能天然适应按钮数量的变化,无需手动调整间距。
如何实现动态控制:
@State buttonCount: number = 4;
getButtonArray(): number[] {
let arr: number[] = [];
for (let i = 0; i < this.buttonCount; i++) {
arr.push(i);
}
return arr;
}
通过改变 buttonCount 状态变量的值,UI 会自动重新渲染,FlexAlign.SpaceAround 会自动重新计算间距。
关键优势:
- 零维护成本:增加或减少按钮时,无需修改任何间距代码
- 自适应性强:2 个按钮和 6 个按钮都能获得合理的间距
- 代码简洁:
ForEach+ 状态变量的组合比逐个编写 Button 优雅得多
四、综合案例:操作面板的设计与实现
4.1 需求分析
一个典型的操作面板通常包含:
- 主操作区:核心功能按钮(新建、复制、剪切、粘贴),以图标 + 文字的形式呈现
- 次操作区:辅助功能按钮(全选、反选、删除、重命名),以文本按钮的形式呈现
- 标题区:显示当前面板的上下文信息(如"文件管理")
4.2 设计方案
// 主操作区 — SpaceAround 均匀分布
Row() {
createIconButton('📁', '新建')
createIconButton('📋', '复制')
createIconButton('✂️', '剪切')
createIconButton('📄', '粘贴')
}
.width('100%')
.justifyContent(FlexAlign.SpaceAround)
// 次操作区 — SpaceBetween 两端对齐 + Blank 弹性分隔
Row() {
createSmallBtn('全选')
Blank()
createSmallBtn('反选')
Blank()
createSmallBtn('删除')
Blank()
createSmallBtn('重命名')
}
.width('100%')
4.3 设计思路解析
为什么主操作区使用 SpaceAround?
主操作区的按钮以图标 + 文字的形式呈现,每个按钮的视觉重量相近。使用 SpaceAround 可以让它们均匀分布在面板中,首尾留出适度的边距,视觉上更"透气"。
为什么次操作区使用 SpaceBetween + Blank?
次操作区是文本按钮,字数不同("全选"2 字、"重命名"3 字),如果直接用 SpaceBetween,按钮会堆积在首尾。通过插入 Blank(),让 Blank 智能填充中间空间,实现"按钮分布在整行、间距由系统自动计算"的效果。
4.4 视觉层次设计
一个优秀的操作面板不仅需要功能完备,还需要有清晰的视觉层次:
┌──────────────────────────────────┐
│ 文件管理 │ ← 标题(16sp,加粗)
│ │
│ 📁 📋 ✂️ 📄 │ ← 主操作(图标+文字)
│ 新建 复制 剪切 粘贴 │ SpaceAround 均匀环绕
│ │
│ 全选 反选 删除 重命名 │ ← 次操作(文本按钮)
│ │ SpaceBetween + Blank
└──────────────────────────────────┘
层次设计要点:
- 标题:加粗,与操作区保持 12vp 间距
- 主操作:大图标 + 小文字,视觉重量最高
- 次操作:小文本按钮,视觉重量最轻
- 间距:主操作与次操作之间保持 16vp 间距
4.5 完整实现
@Builder
createIconButton(icon: string, label: string) {
Column({ space: 4 }) {
Text(icon).fontSize(22)
Text(label).fontSize(12).fontColor('#333333')
}
.padding(8)
.borderRadius(8)
.onClick(() => {
// 处理点击事件
})
}
@Builder
createSmallBtn(text: string) {
Button(text)
.fontSize(12)
.fontColor('#007AFF')
.backgroundColor('#E8F0FE')
.borderRadius(6)
.width(60)
.height(30)
}
五、API 24 新特性与最佳实践
5.1 API 24 (HarmonyOS NEXT) 中的布局变化
HarmonyOS NEXT(API 24)在 ArkUI 布局方面引入了一些重要变化:
-
FlexAlign 全面替换 JustifyContent 枚举:旧版 ArkUI 同时支持
JustifyContent和FlexAlign,但在 API 24 中,JustifyContent已被标记为废弃,统一使用FlexAlign。 -
RowOptions 对象的增强:API 24 中,
RowOptions的space参数支持了SpaceType类型,可以接受number、string或Resource类型。 -
性能优化:API 24 对线性布局引擎进行了深度优化,
Row和Column在大量子组件情况下的布局计算性能提升了约 30%。 -
Blank 组件能力增强:
Blank新增了对min参数的 Resource 类型支持。
5.2 性能考量
在使用 Row + FlexAlign + Blank 布局时,需要考虑以下性能因素:
-
嵌套层级:尽量减少不必要的容器嵌套。例如,不要为了给
Row添加背景而额外包裹一个Stack或Flex,直接使用Row的背景色属性即可。 -
ForEach 的性能:当按钮数量较多(超过 10 个)时,使用
ForEach并指定keyGenerator参数可以提高列表 diff 的效率。 -
状态变量粒度:如果某个
Blank或按钮需要单独控制,应使用独立的状态变量,避免父组件的无关状态变化触发整个Row的重绘。
5.3 常见错误与注意事项
5.3.1 父容器未设置宽度
// ❌ 错误:Row 没有设置宽度,Blank 无法生效
Row() {
Text('标题')
Blank()
Button('操作')
}
// ✅ 正确:Row 设置宽度或父容器提供宽度约束
Row() {
Text('标题')
Blank()
Button('操作')
}
.width('100%') // 关键:必须设置宽度
5.3.2 space 与 justifyContent 的互斥关系
// ❌ 错误:同时设置 space 和 SpaceBetween,space 不生效
Row({ space: 20 }) {
Button('A')
Button('B')
Button('C')
}
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
// ✅ 正确:只使用 justifyContent
Row() {
Button('A')
Button('B')
Button('C')
}
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
5.3.3 Blank 只能在 Row/Column/Flex 中使用
// ❌ 错误:Blank 在 Stack 中不生效
Stack() {
Blank() // 不会填充空间
Button('OK')
}
// ✅ 正确:将 Blank 放在 Row 中
Row() {
Blank()
Button('OK')
}
.width('100%')
5.4 响应式适配建议
在不同的屏幕尺寸和设备形态下,按钮组的布局策略应有所调整:
| 设备类型 | 建议方案 | 说明 |
|---|---|---|
| 手机(竖屏) | SpaceAround 或 SpaceEvenly | 按钮适中数量,均匀分布 |
| 手机(横屏) | SpaceBetween | 空间更充裕,最大化利用 |
| 平板 | SpaceBetween + Blank 权重 | 屏幕宽,需精细控制间距比例 |
| 折叠屏(展开) | 多行 Grid 布局 | 空间足够时,考虑 2 行排列 |
| 车机 | SpaceAround + 大按钮 | 间距要大,触摸目标要大 |
六、布局方案决策指南
6.1 根据按钮数量选择方案
按钮数量 = 2
├── 场景:确认/取消 → SpaceAround(居中分布)
├── 场景:左/右操作 → SpaceBetween(分别贴边)
└── 场景:开关/切换 → SpaceEvenly(绝对居中)
按钮数量 = 3-4
├── 场景:操作面板 → SpaceAround(均匀环绕)
├── 场景:工具栏 → SpaceBetween(两端对齐)
└── 场景:导航标签 → SpaceEvenly(等分间距)
按钮数量 ≥ 5
├── 场景:功能键组 → SpaceAround(自然分布)
├── 场景:数字键盘 → SpaceEvenly(网格感)
└── 场景:文字按钮 → SpaceBetween(最大化空间)
6.2 根据功能角色选择方案
| 用户需求 | 推荐方案 | 原因 |
|---|---|---|
| “按钮之间间距均匀” | FlexAlign.SpaceEvenly | 数学上绝对的均匀 |
| “首尾不要顶到边缘” | FlexAlign.SpaceAround | 首尾留出自然边距 |
| “最大化利用空间” | FlexAlign.SpaceBetween | 首尾贴边,零浪费 |
| “需要不等比例间距” | Blank + layoutWeight | 最灵活的控制 |
| “按钮数量会动态变化” | FlexAlign.SpaceAround | 自适应能力最强 |
| “左中右三栏固定” | Blank 分隔 | 结构清晰 |
6.3 方案速查表
| 场景 | 推荐方案 | 核心代码 |
|---|---|---|
| 操作面板主操作 | SpaceAround | .justifyContent(FlexAlign.SpaceAround) |
| 操作面板次操作 | SpaceBetween + Blank | Blank() 插入按钮之间 |
| 底部确认/取消 | SpaceAround | .justifyContent(FlexAlign.SpaceAround) |
| 导航标签栏 | SpaceEvenly | .justifyContent(FlexAlign.SpaceEvenly) |
| 标题+操作按钮 | Blank 分隔 | Text + Blank() + Button |
| 搜索框+按钮 | Blank + layoutWeight | 搜索框 layoutWeight(1) |
| 步骤条(3步) | SpaceEvenly | .justifyContent(FlexAlign.SpaceEvenly) |
| 多按钮工具栏 | SpaceBetween | .justifyContent(FlexAlign.SpaceBetween) |
七、从 Flutter 到 ArkUI 的迁移指南
7.1 概念映射
对于有 Flutter 开发经验的读者,下面的映射表可以帮助快速上手:
| Flutter | HarmonyOS ArkUI | 差异说明 |
|---|---|---|
Row |
Row() |
构造方式类似,但 ArkUI 使用链式调用 |
MainAxisAlignment.spaceAround |
FlexAlign.SpaceAround |
枚举名不同 |
MainAxisAlignment.spaceBetween |
FlexAlign.SpaceBetween |
行为完全相同 |
MainAxisAlignment.spaceEvenly |
FlexAlign.SpaceEvenly |
行为完全相同 |
Spacer() |
Blank() |
行为等价 |
Expanded() |
.layoutWeight() |
按权重分配剩余空间 |
Flexible() |
无直接等价 | 可通过 layoutWeight + 约束实现 |
CrossAxisAlignment |
ItemAlign / VerticalAlign |
用法类似但枚举名不同 |
7.2 代码对照示例
Flutter 版本:
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
ElevatedButton(onPressed: () {}, child: Text('按钮 1')),
ElevatedButton(onPressed: () {}, child: Text('按钮 2')),
ElevatedButton(onPressed: () {}, child: Text('按钮 3')),
],
)
ArkUI 版本:
Row() {
Button('按钮 1').onClick(() => {})
Button('按钮 2').onClick(() => {})
Button('按钮 3').onClick(() => {})
}
.width('100%')
.justifyContent(FlexAlign.SpaceAround)
Flutter 版本(使用 Spacer):
Row(
children: [
Text('标题'),
Spacer(),
IconButton(icon: Icon(Icons.settings), onPressed: () {}),
],
)
ArkUI 版本(使用 Blank):
Row() {
Text('标题')
Blank()
Image({ src: $r('app.media.settings') })
.width(24)
.height(24)
.onClick(() => {})
}
.width('100%')
八、总结与展望
8.1 核心要点回顾
本文从 HarmonyOS ArkUI 的基础组件出发,系统性地介绍了使用 Row + FlexAlign + Blank 实现按钮组均匀间距排列的六种方法:
- SpaceAround:均匀环绕间距,适合操作面板主功能区
- SpaceBetween:两端对齐中间均分,适合最大化利用空间的工具栏
- SpaceEvenly:完全均分间距,适合指示器和步骤条
- Blank 弹性分隔:模拟 Flutter Spacer,实现"左中右"布局
- Blank 比例分配:使用
layoutWeight实现自定义权重 - 动态个数自适应:通过
ForEach+ 状态变量实现零维护的按钮组
8.2 设计原则
在布局设计中,应遵循以下原则:
- 选择合适的对齐方式:根据按钮数量和功能角色选择 SpaceBetween、SpaceAround 或 SpaceEvenly
- 利用弹性填充简化布局:用
Blank替代手动的间距计算 - 拥抱动态性:用
ForEach+ 状态变量替代静态的按钮列表 - 保持层级简洁:避免不必要的容器嵌套
- 考虑响应式:在不同屏幕尺寸下采用不同的布局策略
8.3 未来展望
随着 HarmonyOS 生态的不断发展,ArkUI 的布局能力也在持续增强。未来值得关注的方向包括:
- 自适应布局的进一步智能化:容器可能可以根据子组件的数量和内容自动选择最优的分布模式
- 跨设备布局适配:同一布局代码可以在手机、平板、车机等不同设备上自动调整排列方式
- 布局动画的深度融合:当按钮数量或排列方式变化时,自动触发平滑的过渡动画
- 声明式布局约束:更强大的布局约束系统,让开发者可以声明式地描述布局意图而非精确的数值
附录
A. 完整示例代码
完整的演示代码位于 entry/src/main/ets/pages/Index.ets,包含了本文介绍的所有六种布局方法和综合操作面板案例。
B. 参考资源
更多推荐



所有评论(0)