【共创季稿事节】鸿蒙原生ArkTS布局方式之ColumnStretch垂直排列




鸿蒙原生ArkTS布局方式之ColumnStretch垂直排列
摘要: ColumnStretch 是鸿蒙原生 ArkUI 框架中最常用也是最重要的垂直布局模式之一。它基于 Column 容器,通过设置
alignItems(ItemAlign.Stretch)使所有子组件在水平方向上自动拉伸至容器宽度,实现整齐划一的等宽布局效果。本文将从设计理念、核心API、布局机制、实战场景、性能优化及常见陷阱六个维度,全方位深入解析 ColumnStretch 布局模式。
一、引言:为什么需要 ColumnStretch?
在移动端应用开发中,纵向列表布局是最基础也是最常见的界面形态。无论是社交 App 的信息流、电商 App 的商品列表,还是管理类 App 的表单页面,本质上都是一系列子组件在垂直方向上的排列组合。
传统的布局方式要求开发者对每个子项手动设置宽度(如 width('100%')),这不仅增加了代码量,更在维护时容易产生遗漏或不一致的问题。ColumnStretch 布局模式应运而生——它是鸿蒙 ArkUI 框架提供的原生解决方案,通过声明式的方式自动完成子组件的水平拉伸对齐。
1.1 设计哲学:声明式布局的优越性
鸿蒙 ArkUI 采用声明式 UI 编程范式,其核心理念是"描述你想要什么,而不是怎么实现"。ColumnStretch 正是这一理念的典型体现:
- 传统命令式做法: 创建一个纵向容器 → 遍历数据为每个子项设置宽度为100% → 处理边距和内间距 → 手动对齐
- 声明式做法: Column → 设置 alignItems(ItemAlign.Stretch) → 放入子组件 → 自动完成
声明式的优势在于代码即视图描述,减少了过程式的"如何做"代码,让开发者更专注于"是什么"的业务逻辑。
1.2 适用场景全景
ColumnStretch 布局模式适用于但不限于以下场景:
| 场景类别 | 具体示例 | 核心需求 |
|---|---|---|
| 纵向列表 | 新闻信息流、商品列表、消息列表 | 所有列表项等宽、自适应高度 |
| 表单页面 | 注册登录、个人资料编辑、设置页 | 输入框等宽对齐,标签统一 |
| 信息展示 | 个人主页、详情页、统计面板 | 卡片模块等宽排列 |
| 设置页面 | 系统设置、偏好配置 | 设置项等宽、带分割线 |
| 评论区 | 评论列表、回复楼层 | 头像+内容等宽对齐 |
二、核心API深入剖析
ColumnStretch 布局模式的核心由三个 API 元素组成:Column 容器、alignItems 方法和 ItemAlign.Stretch 枚举值。下面逐一深入解析。
2.1 Column 容器:垂直布局的基石
Column 是 ArkUI 中最基本的垂直布局容器,其核心特性如下:
2.1.1 基本特性
Column() {
// 子组件按从上到下的顺序排列
}
.width('100%') // 容器宽度
.height('100%') // 容器高度
Column 使用 Flexbox 布局算法,主轴方向为垂直(从上到下),交叉轴方向为水平(从左到右)。这与 Web 端的 flex-direction: column 在概念上一致。
2.1.2 主轴对齐:justifyContent
Column 的主轴是垂直方向,通过 justifyContent 控制子组件在垂直方向上的分布方式:
Column() {
// 子组件...
}
.justifyContent(FlexAlign.Start) // 顶部对齐(默认)
.justifyContent(FlexAlign.Center) // 居中对齐
.justifyContent(FlexAlign.End) // 底部对齐
.justifyContent(FlexAlign.SpaceBetween) // 两端对齐,子项间间距相等
.justifyContent(FlexAlign.SpaceAround) // 子项周围间距相等
.justifyContent(FlexAlign.SpaceEvenly) // 子项间及两端间距相等
在 ColumnStretch 模式下,justifyContent 通常配合 Scroll 容器使用,内容高度超过容器时才体现出分布效果。
2.1.3 交叉轴控制:alignItems
Column 的交叉轴是水平方向,alignItems 控制子组件在水平方向上的对齐方式——这正是 ColumnStretch 的关键所在:
Column() {
// 子组件...
}
.alignItems(ItemAlign.Start) // 左对齐(默认)
.alignItems(ItemAlign.Center) // 水平居中
.alignItems(ItemAlign.End) // 右对齐
.alignItems(ItemAlign.Stretch) // ★ 拉伸填满(ColumnStretch的核心)
2.2 ItemAlign.Stretch:拉伸机制详解
ItemAlign.Stretch 是 ColumnStretch 的精髓。当 Column 设置了该属性后,所有直接子组件会在交叉轴方向(水平方向)被拉伸至 Column 容器的宽度。
2.2.1 拉伸规则
拉伸行为遵循以下规则:
- 容器宽度决定拉伸范围: 子组件的拉伸宽度等于 Column 容器的
width值(通常为 ‘100%’) - 内间距影响有效宽度: 如果 Column 设置了
padding,子组件拉伸后的宽度为容器宽度减去左右内间距 - 子组件自身宽度被覆盖: 即使子组件设置了固定宽度(如
width(100)),在 Stretch 模式下也会被拉伸 - 嵌套容器不受影响: Stretch 只作用于直接子组件,不穿透到孙组件
2.2.2 边界情况处理
| 情况 | 表现 | 处理方式 |
|---|---|---|
| 子组件无明确宽度 | 自动拉伸至容器宽度 | 正常,推荐做法 |
| 子组件设置了固定宽度 | 固定宽度被忽略,强制拉伸 | 子组件的 width 声明会被覆盖 |
| 子组件使用了 layoutWeight | layoutWeight 在 Stretch 下仍有效 | 结合使用可实现弹性宽度分配 |
| 子组件为 Blank | Blank 也会被拉伸至满宽 | 如需弹性空白,需在外层再包裹 Row |
2.3 配套容器 Scroll:可滚动列表的实现
ColumnStretch 通常与 Scroll 容器配合使用,以实现可滚动的纵向列表:
Scroll() {
Column() {
// 大量子组件...
}
.width('100%')
.alignItems(ItemAlign.Stretch)
}
.width('100%')
关键要点:
Scroll本身需要设置宽度和高度(或通过父容器约束)Scroll内部的 Column 负责布局和拉伸Scroll自动检测内容高度是否超过容器,超过时可滚动- 通过
scrollBar(BarState.Off)可隐藏滚动条
三、布局机制深度解析
3.1 Flexbox 算法在 Column 中的实现
ArkUI 的 Column 容器底层基于 Flexbox 布局算法实现。理解这一算法有助于掌握 ColumnStretch 在不同场景下的表现。
3.1.1 尺寸计算流程
Column 容器的尺寸计算遵循以下步骤:
- 确定容器尺寸: 根据父容器约束和自身的 width/height 声明确定容器的最终尺寸
- 计算交叉轴(水平方向):
- 如果设置了
ItemAlign.Stretch,子组件的交叉轴尺寸被设置为容器交叉轴尺寸减去内间距 - 如果子组件有
minWidth/maxWidth约束,最终尺寸受这些约束限制
- 如果设置了
- 计算主轴(垂直方向):
- 子组件根据内容确定自然高度
- 如果设置了固定高度,使用固定高度
- 如有剩余空间,根据
justifyContent分布
3.1.2 与 Web Flexbox 的对比
| 概念 | ArkUI Column | Web CSS Flexbox |
|---|---|---|
| 主轴方向 | 垂直 | flex-direction: column |
| 交叉轴控制 | alignItems | align-items |
| 交叉轴拉伸 | ItemAlign.Stretch | align-items: stretch |
| 主轴分布 | justifyContent | justify-content |
| 弹性权重 | layoutWeight | flex: weight |
| 换行 | 不支持自动换行 | flex-wrap: wrap |
3.2 嵌套 Stretch:多层级拉伸的协调
在实际项目中,ColumnStretch 经常需要多层嵌套使用。理解嵌套时的拉伸传递机制至关重要。
3.2.1 一层嵌套:父Column拉伸影响子Column
Column() {
.alignItems(ItemAlign.Stretch)
Column() {
// 子Column的宽度被拉伸至父Column的宽度
// 其内部的 alignItems 独立控制它自己的子组件
}
.alignItems(ItemAlign.Center) // 子Column内部采用居中布局
}
外层 Column 的 Stretch 将内层 Column 拉伸至满宽,但内层 Column 可以独立设置自己的 alignItems 来控制其子组件的对齐方式。
3.2.2 多层嵌套的注意事项
- 宽度传递: Stretch 只对直接子组件生效,不会"穿透"多层
- 性能考量: 过多层嵌套会增加布局计算开销,建议控制在 5 层以内
- 合理拆分: 当需要复杂的混合布局时,将 UI 拆分为多个 @Builder 方法,每个方法负责一个独立的布局层级
3.3 动态内容的自适应
ColumnStretch 对动态内容有良好的自适应能力:
@State items: string[] = [];
build() {
Column() {
ForEach(this.items, (item: string) => {
Text(item)
.width('100%') // 会被 Stretch 拉伸
.padding(12)
.backgroundColor('#FFFFFF')
.margin({ bottom: 8 })
})
}
.width('100%')
.alignItems(ItemAlign.Stretch)
}
当 items 数组动态变化时,Column 自动重新布局,所有子项自动保持等宽。无需手动操作 DOM 或重新计算尺寸。
四、实战场景代码详解
4.1 场景一:标准信息流列表
信息流列表是 ColumnStretch 最典型的应用场景。以下代码展示了一个完整的新闻资讯列表:
@Builder
buildNewsFeed() {
Scroll() {
Column() {
// 分区标题
Text('最新资讯')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.width('100%')
.padding({ bottom: 12 })
// 列表项
ForEach(this.newsList, (item: NewsItem) => {
this.buildNewsCard(item)
})
}
.width('100%')
.padding(16)
.alignItems(ItemAlign.Stretch)
}
.width('100%')
.backgroundColor('#F5F5F5')
}
@Builder
buildNewsCard(item: NewsItem) {
Row() {
// 左侧缩略图
Image(item.thumbnailUrl)
.width(80)
.height(60)
.borderRadius(8)
// 右侧文字区
Column() {
Text(item.title)
.fontSize(15)
.fontWeight(FontWeight.Medium)
.maxLines(2)
.overflow(TextOverflow.Ellipsis)
Text(item.summary)
.fontSize(12)
.fontColor('#999999')
.margin({ top: 4 })
.maxLines(1)
.overflow(TextOverflow.Ellipsis)
}
.layoutWeight(1)
.margin({ left: 10 })
}
.width('100%')
.padding(12)
.backgroundColor('#FFFFFF')
.borderRadius(10)
.margin({ bottom: 10)
}
布局要点:
- 外层 Column 设置
alignItems(ItemAlign.Stretch),确保所有新闻卡片等宽 - 每个卡片内部使用 Row 实现左右布局(图片 + 文字)
- 文字区使用
layoutWeight(1)占据剩余宽度 - Scroll 容器支持纵向滚动
4.2 场景二:完整表单页面
表单页面对布局的一致性要求极高,ColumnStretch 天然适合表单场景:
@Builder
buildFormScene() {
Scroll() {
Column() {
// 页面标题
Text('用户注册')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.width('100%')
.margin({ bottom: 24 })
// 表单卡片
Column() {
// 用户名
this.buildFormField('用户名', '请输入用户名', this.username)
Divider().height(1).color('#F0F0F0')
// 密码
this.buildFormField('密码', '请输入密码', this.password)
Divider().height(1).color('#F0F0F0')
// 确认密码
this.buildFormField('确认密码', '请再次输入密码', this.confirmPassword)
}
.width('100%')
.backgroundColor('#FFFFFF')
.borderRadius(12)
.alignItems(ItemAlign.Stretch)
// 注册按钮
Button('注册')
.width('100%')
.height(48)
.backgroundColor('#007AFF')
.borderRadius(12)
.margin({ top: 20 })
.onClick(() => { this.handleRegister() })
}
.width('100%')
.padding(16)
.alignItems(ItemAlign.Stretch)
}
.width('100%')
}
@Builder
buildFormField(label: string, placeholder: string, value: string) {
Column() {
Text(label)
.fontSize(14)
.fontColor('#333333')
.width('100%')
.margin({ top: 12, left: 16 })
TextInput({ placeholder, text: value })
.width('100%')
.height(44)
.margin({ top: 6, bottom: 12, left: 16, right: 16 })
.backgroundColor('#F8F9FA')
.borderRadius(8)
.padding({ left: 12 })
}
.width('100%')
.alignItems(ItemAlign.Stretch)
}
布局要点:
- 表单卡片内部嵌套 Column + Stretch,确保所有 TextInput 宽度一致
- Divider 自动撑满整行作为视觉分割
- 提交按钮直接放在外层 Column 中,同样被拉伸至满宽
- 每个表单字段的标签和输入框通过内部 Column 组织
4.3 场景三:混合卡片布局
有时需要在 ColumnStretch 中混合不同宽度的子组件,可以通过 Row 容器在内部进行二次布局:
@Builder
buildMixedCardScene() {
Column() {
// 全宽主卡片
this.buildPrimaryCard(
'布局引擎',
'ColumnStretch 是鸿蒙原生垂直布局方案...',
'#E8F0FE'
)
// 两列等宽卡片(Row 内部分两列)
Row() {
this.buildSecondaryCard(
'📱', '响应式设计',
'#FFF3E0'
)
this.buildSecondaryCard(
'🎯', '高性能',
'#E8F5E9'
)
}
.width('100%')
.alignItems(VerticalAlign.Top)
.justifyContent(FlexAlign.SpaceBetween)
// 全宽提示卡片
this.buildTipCard(
'💡 提示信息',
'使用 Column + Stretch 可以显著减少重复的宽度设置代码...'
)
}
.width('100%')
.padding(16)
.alignItems(ItemAlign.Stretch)
}
布局要点:
- Column + Stretch 确保主卡片和提示卡片等宽
- Row 内部的子卡片使用
width('48%')实现两列等宽效果 - Row 容器作为 Column 的子组件也被拉伸至满宽,但其内部布局由 Row 自身控制
五、性能优化与最佳实践
5.1 减少不必要的嵌套
ColumnStretch 虽然支持多层嵌套,但过多的嵌套层次会增加布局计算的开销。以下是一些优化建议:
❌ 不推荐的深层嵌套:
Column() { // 第1层
.alignItems(ItemAlign.Stretch)
Column() { // 第2层
.alignItems(ItemAlign.Stretch)
Column() { // 第3层
.alignItems(ItemAlign.Stretch)
// 实际内容...
}
}
}
✅ 推荐的扁平化结构:
Column() { // 仅1层容器
.alignItems(ItemAlign.Stretch)
// 使用 @Builder 拆分内容
this.buildContent()
}
5.2 合理使用 layoutWeight
当需要在 ColumnStretch 中实现非等分比例时,layoutWeight 是非常有用的工具:
Row() {
Column() {
// 左侧区域,占据剩余空间的1份
}
.layoutWeight(1)
Column() {
// 右侧区域,占据剩余空间的2份
}
.layoutWeight(2)
}
.width('100%')
在 ColumnStretch 的上下文中,layoutWeight 在 Row 容器内使用最为常见,用于控制水平方向上不同区域的宽度比例。
5.3 使用 @Builder 拆分复杂布局
当 ColumnStretch 中的内容变得复杂时,将子组件抽取为独立的 @Builder 方法是良好的工程实践:
@Component
struct MyPage {
build() {
Column() {
.alignItems(ItemAlign.Stretch)
this.buildHeader()
this.buildContent()
this.buildFooter()
}
}
@Builder
buildHeader() { /* 头部区域 */ }
@Builder
buildContent() { /* 内容区域 */ }
@Builder
buildFooter() { /* 底部区域 */ }
}
这样做的优点:
- 每个 @Builder 方法职责单一,便于理解和维护
- 支持单独测试每个区域
- 代码复用性更高
5.4 善用 LazyForEach 优化长列表
当 ColumnStretch 中需要渲染大量列表项(如几百上千条)时,推荐使用 LazyForEach 替代 ForEach:
class MyDataSource implements IDataSource {
// 实现数据源接口...
}
build() {
Column() {
LazyForEach(this.dataSource, (item: ItemType) => {
this.buildListItem(item)
})
}
.width('100%')
.alignItems(ItemAlign.Stretch)
}
LazyForEach 只渲染当前可见区域的子组件,大幅减少内存占用和布局计算量。
5.5 避免状态变量频繁更新导致重渲染
ColumnStretch 中的每个子组件都会被拉伸,如果子组件内的状态变量频繁变化(如动画、实时数据),可能会导致整个 Column 重新布局。优化策略:
- 状态提升: 将需要频繁更新的状态放在具体的子组件中
- 使用 @ObjectLink: 对于深层嵌套的对象,精细控制响应式更新范围
- 延迟更新: 使用 debounce 或 throttle 降低更新频率
六、常见陷阱与解决方案
6.1 子组件设置了固定宽度
问题: 某些子组件设置了固定宽度(如 width(100)),但在 Stretch 模式下固定宽度被忽略。
原因: ItemAlign.Stretch 会强制子组件的交叉轴尺寸等于容器的交叉轴尺寸。
解决方案:
- 如果希望某个子组件不被拉伸,可以将其放在外部 Row 容器中
- 或者使用
alignSelf属性覆盖父容器的对齐设置 - 或者调整布局结构,在 Stretch 容器外用其他布局容器包裹
6.2 Scroll 容器高度异常
问题: Scroll 容器内的 Column 设置了 Stretch,但列表无法滚动或高度不正确。
原因: 通常是因为 Scroll 本身没有固定高度,或者 Column 的高度设置为 ‘100%’ 导致内容被截断。
解决方案:
Scroll() {
Column() {
// 内容区域
}
.width('100%')
.alignItems(ItemAlign.Stretch)
}
.width('100%')
// Scroll 的高度需要由父容器约束,或者使用 .layoutWeight(1) 占据剩余空间
6.3 分割线无法撑满
问题: 在 ColumnStretch 中使用 Divider 作为分割线,发现宽度不对。
原因: Divider 的默认宽度可能不是 100%。
解决方案:
Divider()
.width('100%') // 显式设置宽度为100%
.height(1)
.color('#F0F0F0')
6.4 嵌套 Stretch 导致布局混乱
问题: 多层嵌套 Column 都设置了 Stretch,导致某些子组件尺寸异常。
原因: 每层 Column 的 Stretch 都会拉伸其直接子组件,多层叠加可能产生非预期的效果。
解决方案: 明确每层 Column 的职责,外层负责整体页面框架,内层负责具体模块布局。不要在所有层级都无脑使用 Stretch。
6.5 justifyContent 与 Stretch 的竞争
问题: 同时设置了 justifyContent(FlexAlign.SpaceBetween) 和 alignItems(ItemAlign.Stretch),子组件之间的间距不符合预期。
原因: justifyContent 控制主轴(垂直方向)的分布,alignItems 控制交叉轴(水平方向)的对齐/拉伸。两者作用在不同维度,但剩余空间的计算存在相互影响。
解决方案: 理解两者的作用维度,使用合适的 padding 或 margin 替代 justifyContent 来控制间距,或使用 Blank 组件作为弹性填充。
七、与其他布局方式的对比
7.1 ColumnStretch vs RowStretch
| 对比维度 | ColumnStretch | RowStretch |
|---|---|---|
| 容器类型 | Column | Row |
| 主轴方向 | 垂直(从上到下) | 水平(从左到右) |
| 拉伸方向 | 水平(所有子项等宽) | 垂直(所有子项等高) |
| 适用场景 | 列表、表单、信息流 | 工具栏、标签栏、导航栏 |
| 配合容器 | Scroll | Scroll(横向模式) |
7.2 ColumnStretch vs List
| 对比维度 | ColumnStretch + Scroll | List |
|---|---|---|
| 实现复杂度 | 中等,手动管理布局 | 低,内置列表管理 |
| 子组件类型 | 任意组件,可混合 | 列表项需统一结构 |
| 性能(大量数据) | 需配合 LazyForEach | 内置懒加载机制 |
| 自定义程度 | 高,完全自定义布局 | 中等,受限于 ListItem |
| 适用场景 | 中小规模、高度定制化的列表 | 大规模、结构统一的长列表 |
7.3 ColumnStretch vs Flex
| 对比维度 | ColumnStretch | Flex 布局 |
|---|---|---|
| API复杂度 | 简单,一行关键代码 | 中等,需配置多个属性 |
| 学习成本 | 低,概念直观 | 中等,需理解 Flexbox 模型 |
| 灵活性 | 中等,固定为等宽 | 高,可自由控制每个子项 |
| 代码可读性 | 高,意图明确 | 中等 |
| 推荐场景 | 90% 的纵向列表场景 | 需要混合对齐方式的复杂布局 |
八、综合示例:完整的专栏页面
以下是一个完整的专栏信息页示例,综合运用了 ColumnStretch 的各种特性:
@Entry
@Component
struct ColumnPage {
@State articleList: ArticleItem[] = [
{
title: '鸿蒙生态进展迅速',
summary: 'HarmonyOS NEXT 已适配超5000款常用应用...',
date: '2025-01-15',
tag: '资讯'
},
{
title: 'ArkUI 新特性发布',
summary: '全新 ColumnStretch 布局模式上线...',
date: '2025-01-12',
tag: '技术'
}
];
build() {
Column() {
this.buildHeader()
this.buildTabBar()
this.buildContent()
}
.width('100%')
.height('100%')
.backgroundColor('#F5F5F5')
.alignItems(ItemAlign.Stretch)
}
@Builder
buildHeader() {
Row() {
Circle().width(28).height(28).fill('#007AFF')
Text('专栏').fontSize(18).fontWeight(FontWeight.Bold)
Blank()
Text('···').fontSize(22)
}
.width('100%')
.height(56)
.backgroundColor('#FFFFFF')
.padding({ left: 16, right: 16 })
.alignItems(VerticalAlign.Center)
}
@Builder
buildTabBar() {
Row() {
this.tabItem('推荐', 0)
this.tabItem('关注', 1)
this.tabItem('热门', 2)
}
.width('100%')
.height(44)
.backgroundColor('#FFFFFF')
.justifyContent(FlexAlign.SpaceEvenly)
.alignItems(VerticalAlign.Center)
}
@Builder
tabItem(label: string, index: number) {
Text(label)
.fontSize(15)
.fontColor(index === 0 ? '#007AFF' : '#666666')
.fontWeight(index === 0 ? FontWeight.Bold : FontWeight.Normal)
.onClick(() => { /* 切换标签 */ })
}
@Builder
buildContent() {
Scroll() {
Column() {
ForEach(this.articleList, (item: ArticleItem) => {
this.buildArticleCard(item)
})
}
.width('100%')
.padding(12)
.alignItems(ItemAlign.Stretch)
}
.width('100%')
.scrollBar(BarState.Off)
}
@Builder
buildArticleCard(item: ArticleItem) {
Column() {
Text(item.title)
.fontSize(16)
.fontWeight(FontWeight.Medium)
.width('100%')
Text(item.summary)
.fontSize(13)
.fontColor('#666666')
.width('100%')
.margin({ top: 6 })
.lineHeight(20)
.maxLines(2)
.overflow(TextOverflow.Ellipsis)
Row() {
Text(item.date).fontSize(11).fontColor('#999999')
Blank()
Text(item.tag).fontSize(11).fontColor('#007AFF')
}
.width('100%')
.margin({ top: 8 })
}
.width('100%')
.padding(14)
.backgroundColor('#FFFFFF')
.borderRadius(10)
.margin({ bottom: 10 })
}
}
interface ArticleItem {
title: string;
summary: string;
date: string;
tag: string;
}
九、结语
ColumnStretch 是鸿蒙 ArkUI 框架中最基础也最实用的布局模式之一。通过 Column + alignItems(ItemAlign.Stretch) 的简单组合,开发者可以快速构建出整齐划一、响应自适应的纵向列表页面。
核心要点回顾:
- 一句话记住: Column 容器 +
alignItems(ItemAlign.Stretch)= 所有子组件自动等宽 - 三个关键属性:
width('100%')确保容器撑满、alignItems(ItemAlign.Stretch)实现拉伸、justifyContent控制垂直分布 - 适用场景: 信息流列表、表单页面、设置页、评论区、文章列表等几乎所有需要纵向排列且子项等宽的场景
- 最佳实践: 搭配 Scroll 实现滚动列表,使用 LazyForEach 处理长列表,通过 @Builder 拆分复杂布局
ColumnStretch 的简洁性和声明式特性充分体现了 HarmonyOS ArkUI 框架的设计理念——让开发者用最少的代码、最清晰的语义,构建出高质量的跨设备应用界面。
在实际项目中,理解并善用 ColumnStretch 布局模式,不仅能提高开发效率,更能保证界面在不同屏幕尺寸下的一致性表现。无论你是刚接触鸿蒙开发的新手,还是有丰富经验的老手,ColumnStretch 都值得深入掌握并作为你的布局首选方案。
延伸阅读: 鸿蒙官方文档《ArkUI 布局开发指南》、《Column 容器API参考》、《Flexbox 布局算法详解》
示例源码: 本文所有示例代码可在 HarmonyOS NEXT 开发环境中直接运行测试。
版本信息: 本文基于 HarmonyOS NEXT (API 12) 编写。
更多推荐


所有评论(0)