鸿蒙应用开发从入门到实战(二十三):一文搞懂ArkUI弹性布局

news/2025/10/16 8:59:21/文章来源:https://www.cnblogs.com/heimatengyun/p/19144735

大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!

ArkUI提供了各种布局组件用于界面布局,本文研究使用Flex组件实现弹性布局。

一、概述

弹性布局(Flex)的效果类似于线性布局(Column/Row),也会使子元素呈线性排列,但是弹性布局在子元素的排列、对齐和剩余空间的分配等方面更加灵活。

二、参数

Flex组件的参数定义如下,下面逐一介绍每个属性

Flex(value?: { direction?: FlexDirection, justifyContent?: FlexAlign, alignItems?: ItemAlign, wrap?: FlexWrap, alignContent?: FlexAlign })

2.1 布局方向(direction)

direction用于设置Flex容器的布局方向,即子元素的排列方向,其类型FlexDirection为枚举类型,可选的枚举值如下

1布局方向

示例代码

pages/component/layout目录下新建flex目录,新建DirectionPage.ets文件

@Entry
@Component
struct DirectionPage {build() {Column({ space: 50 }) {Flex({ direction: FlexDirection.ColumnReverse }) {Text('1').width(100).height(100).itemTextStyle4()Text('2').width(100).height(100).itemTextStyle4()Text('3').width(100).height(100).itemTextStyle4()}.height(350).width(350).flexStyle4()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle4() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle4() {.backgroundColor('#f5f5f5').borderWidth(1)
}

Flex容器中也有主轴交叉轴两个概念,其中主轴方向与direction一致,交叉轴与主轴垂直,具体方向如下

2主轴与交叉轴

2.2 主轴排列方式(justifyContent)

justifyContent参数的作用同Column/Row容器的justifyContent()完全相同,也是用于设置子元素在主轴方向的排列方式,其类型同样为FlexAlign,可选的枚举值如下
3主轴排列方式

示例代码

pages/component/layout/flex目录,新建JustifyContentPage.ets文件

@Entry
@Component
struct JustifyContentPage {build() {Column({ space: 50 }) {Flex({direction: FlexDirection.Row,justifyContent: FlexAlign.Start}) {Text('1').width(50).height(50).itemTextStyle5()Text('2').width(50).height(50).itemTextStyle5()Text('3').width(50).height(50).itemTextStyle5()}.height(50).width(300).flexStyle5()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle5() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle5() {.backgroundColor('#f5f5f5').borderWidth(1)
}

2.3 交叉轴对齐方式(alignItems)

alignItems参数的作用同Column/Row容器的alignItems()相同,也是用于设置子元素在交叉轴的对齐方式。但该参数的类型与Column/Row容器的alignItems()方法不同,为ItemAlign,可选的枚举值有

4交叉轴排列方式

示例代码

pages/component/layout/flex目录,新建AlignItemsFlexPage.ets文件

@Entry
@Component
struct AlignItemsFlexPage {build() {Column({ space: 50 }) {Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Baseline}) {Text('Beyond').width(100).height(100).itemTextStyle6()Text('章').width(100).height(200).itemTextStyle6()Text('章').width(100).height(150).itemTextStyle6()}.height(350).width(350).flexStyle6()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle6() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle6() {.backgroundColor('#f5f5f5').borderWidth(1)
}

2.4 布局换行(列)(wrap)

默认情况下,Flex容器的子组件,都排在一条线(主轴)上。当子组件在主轴方向的尺寸之和大于Flex容器时,为适应容器尺寸,所有子组件的尺寸都会自动收缩。如果需要保持子组件的尺寸不收缩,也可选择令子组件换行(列)显示。

wrap属性的作用就是控制如何换行,该属性的类型FlexWrap为枚举类型,可选的枚举值如下

5布局换行

示例代码

pages/component/layout/flex目录,新建WrapPage.ets文件

@Entry
@Component
struct WrapPage {build() {Column({ space: 50 }) {Flex({direction: FlexDirection.Row,wrap: FlexWrap.WrapReverse}) {Text('1').width(100).height(100).itemTextStyle7()Text('2').width(100).height(100).itemTextStyle7()Text('3').width(100).height(100).itemTextStyle7()Text('4').width(100).height(100).itemTextStyle7()Text('5').width(100).height(100).itemTextStyle7()Text('6').width(100).height(100).itemTextStyle7()}.height(350).width(350).flexStyle7()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle7() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle7() {.backgroundColor('#f5f5f5').borderWidth(1)
}

2.5 交叉轴多行排列方式(alignContent)

Flex容器中包含多行(列)时,可使用alignContent设置多行在交叉轴的排列方式,该属性的类型为FlexAlign,可选的枚举值如下

6交叉轴多行排列

示例代码

pages/component/layout/flex目录,新建AlignContentPage.ets文件

@Entry
@Component
struct AlignContentPage {build() {Column({ space: 50 }) {Flex({direction: FlexDirection.Row,wrap: FlexWrap.Wrap,alignContent: FlexAlign.SpaceAround,}) {Text('1').width(100).height(100).itemTextStyle8()Text('2').width(100).height(100).itemTextStyle8()Text('3').width(100).height(100).itemTextStyle8()Text('4').width(100).height(100).itemTextStyle8()Text('5').width(100).height(100).itemTextStyle8()Text('6').width(100).height(100).itemTextStyle8()}.height(350).width(350).flexStyle8()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle8() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle8() {.backgroundColor('#f5f5f5').borderWidth(1)
}

三、子组件常用属性

3.1 交叉轴对齐(alignSelf)

Flex容器的子组件可以使用alignSelf()方法单独设置自己的交叉轴对齐方式,并且其优先级高于Flex容器alignItems。具体效果如下

说明:

alignSelf()的参数类型和alignItems()相同,均为ItemAlign枚举类型,且各枚举值的含义也完全相同。

代码

Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Start }) {Text('1').width(100).height(100).itemTextStyle()Text('2').width(100).height(200).itemTextStyle()Text('3').width(100).height(150).itemTextStyle().alignSelf(ItemAlign.End) //单独设置交叉轴对齐方式
}.height(300)
.width('95%')
.flexStyle()

效果

7alignSelf

示例代码

pages/component/layout/flex目录,新建AlignSelfPage.ets文件

@Entry
@Component
struct AlignSelfPage {build() {Column({ space: 50 }) {Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Start}) {Text('1').width(100).height(100).itemTextStyle9()Text('2').width(100).height(200).itemTextStyle9()Text('3').width(100).height(150).itemTextStyle9().alignSelf(ItemAlign.End)}.height(350).width(350).flexStyle9()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle9() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle9() {.backgroundColor('#f5f5f5').borderWidth(1)
}

3.2 自适应伸缩

弹性布局的显著特点之一是子组件沿主轴方向的尺寸具有弹性,即子组件的大小能够随着Flex容器尺寸的变化而自动伸缩。这种弹性特性使得Flex布局能够使子组件更灵活地适应不同的屏幕尺寸和设备。和自适应伸缩的相关的属性有flexShrinkflexGrowflexBasis,下面逐一介绍

3.2.1 flexShrink 压缩

flexShrink用于设置父容器空间不足时,子组件的压缩比例,尺寸的具体计算逻辑如下

代码

//Flex容器主轴尺寸为240,子组件主轴尺寸之和为100*3=300
Flex() {//尺寸=100Text('1').width(100).height(100).flexShrink(0) //不压缩//主轴尺寸=100-(300-240)*(1/3)=80Text('2').width(100).height(100).flexShrink(1) //压缩比例为1//主轴尺寸=100-(300-240)*(2/3)=60Text('3').width(100).height(100).flexShrink(2) //压缩比例为2}.height(150)
.width(240)

效果

8flexShrink

示例代码

pages/component/layout/flex目录,新建FlexShrinkPage.ets文件

@Entry
@Component
struct FlexShrinkPage {build() {Column({ space: 50 }) {Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Center}) {//尺寸=100Text('1').width(100).height(100).itemTextStyle10().flexShrink(0) //不压缩//主轴尺寸=100-(300-240)*(1/3)=80Text('2').width(100).height(100).itemTextStyle10().flexShrink(1) //压缩比例为1//主轴尺寸=100-(300-240)*(2/3)=60Text('3').width(100).height(100).itemTextStyle10().flexShrink(2) //压缩比例为2}.height(150).width(240).flexStyle10()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle10() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle10() {.backgroundColor('#f5f5f5').borderWidth(1)
}

3.2.2 flexGrow 拉伸

flexGrow用于设置父容器空间充足时,组件瓜分剩余空间的比例,尺寸的具体计算逻辑如下

代码

Flex() {//尺寸=100Text('1').width(100).height(100).flexGrow(0) //不拉伸//主轴尺寸=100+(360-300)*(1/3)=120Text('2').width(100).height(100).flexGrow(1) //拉伸比例为1//主轴尺寸=100+(360-300)*(2/3)=140Text('3').width(100).height(100).flexGrow(2) //拉伸比例为2}.height(150)
.width(360)

效果

9flexGrow

示例代码

pages/component/layout/flex目录,新建FlexGrowPage.ets文件

@Entry
@Component
struct FlexGrowPage {build() {Column({ space: 50 }) {Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Center}) {//尺寸=100Text('1').width(100).height(100).itemTextStyle11().flexGrow(0) //不拉伸//主轴尺寸=100+(360-300)*(1/3)=120Text('2').width(100).height(100).itemTextStyle11().flexGrow(1) //拉伸比例为1//主轴尺寸=100+(360-300)*(2/3)=140Text('3').width(100).height(100).itemTextStyle11().flexGrow(2) //拉伸比例为2}.height(150).width(360).flexStyle11()}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}@Extend(Text) function itemTextStyle11() {.textAlign(TextAlign.Center).fontColor(Color.White).fontSize(40).fontWeight(FontWeight.Bold).backgroundColor('#008a00').borderWidth(1)
}@Extend(Flex) function flexStyle11() {.backgroundColor('#f5f5f5').borderWidth(1)
}

3.2.3 flexBasis

flexBasis用于设置子组件沿主轴方向的尺寸,相当于width或者height的作用。若设置了flexBasis,则以flexBasis为准,否则以widht或者height为准。

《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 金属复合板厂家最新推荐排行榜:实力厂家产能定制服务全景解析,选购指南必备

金属复合板在建筑装饰、工业制造等领域的应用日益广泛,但行业供需失衡与乱象让采购方陷入选择困境。部分企业缺乏核心技术,产品存在防火等级不足、耐候性差等问题,难以适配医院、化工等特殊场景;产能不稳定导致订单…

CCPC2024成都 游记(VP) 未完成以及一些找补的话

说是 $VP$ 其实是板刷。省流 说是 \(VP\) 其实是板刷。10.7 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 一点开始的,故中午没睡午觉,第一次和 \(Moemi\) 和 \(jry\) 组队打,是一个尝试,不过赛前就说 \(j…

CF1439C Greedy Shopping

CF1439C Greedy Shopping给定一个长为 \(n\) 的单调不增的数组 \(a\),有 \(q\) 次操作:给出 \(x,y\),令区间 \([1,x]\) 内的数对 \(y\) 取 \(\max\)。给出 \(x,y\),从左到右遍历 \([x,n]\) 内的每个数,如果 \(a_i…

Python3 random 模块

Python3 random 模块random 是 Python 标准库中用于生成伪随机数的模块,提供了丰富的随机数生成和随机操作功能,适用于模拟、抽样、打乱顺序等场景。它生成的随机数基于特定算法(伪随机),但对大多数应用场景已足够…

完整教程:AI应用生成平台:数据库、缓存与存储

完整教程:AI应用生成平台:数据库、缓存与存储pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

CCPC2022绵阳 游记(VP)

主包犯蠢浪费 $150min$,从铜首掉下铜中,$5t$ 罚时 $692$。省流 主包犯蠢浪费 \(150min\),从铜首掉下铜中,\(5t\) 罚时 \(692\)。10.14 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 晚上叶神有课,提前到 …

2025 年电缆桥架生产厂家最新推荐排行榜:含北方 / 河北 / 瓦楞 / 防火 / 模压 / 镀锌桥架品牌及合作案例盘点

在电力传输、建筑基建等关键领域,电缆桥架作为线路支撑核心设备,其质量直接决定工程安全与运维稳定性。当前市场中,部分厂家存在工艺粗糙、防腐性能不足、承重不达标等问题,导致桥架寿命缩短、线路故障频发,增加企…

详细介绍:[创业之路-640]:通信行业供应链 - 通信网的发展趋势:IP化统一 、云网融合 、算网协同 、FMC(固定移动融合)、空天地一体化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年胰岛素泵厂家最新推荐排行榜:国产实力厂家技术、口碑及全场景适配方案全景解析软针植入/平衡式留置针/无异物感胰岛素泵厂家推荐

随着糖尿病患者对精准控糖需求的不断提升,胰岛素泵作为核心治疗设备,其技术迭代速度与产品适配性备受关注。当前市场中,既有深耕多年的成熟品牌持续创新,也有新兴企业凭借差异化技术崭露头角,但产品质量、输注精度…

2025 年国内磨床厂家最新推荐榜:聚焦平面磨床外圆磨床等品类,助力企业精准选优质设备

当前磨床市场品类繁杂,平面磨床、外圆磨床、数控磨床等产品质量差异显著,众多企业在选购时常陷入困境。部分厂家缺乏规范质量管控,设备精度与稳定性不足,难以适配汽车、军工、工程机械等行业高标准加工需求;还有厂…

2025 年加工中心厂家最新推荐榜:覆盖立式、卧式、龙门及 850 等多规格设备,帮采购方高效选实力厂商

当前加工中心市场厂商数量繁杂,产品质量、技术实力及服务水平差异显著,汽车摩托车、军工、工程机械等行业采购方在挑选设备时,常因信息不对称难以精准定位符合需求的品牌。部分厂商技术研发薄弱、产品同质化严重,无…

进程的内存管理

> 「C语言进程虚拟内存」:栈、堆、数据段、代码段各自职责、生命周期、典型API 。一、虚拟内存总览:四个大区 任何一个程序,正常运行都需要内存资源,用来存放诸如变量、常量、函数代码等等。这些不同的内容,所…

深入理解Java内存模型与volatile关键字:从理论到实践

1. 引言:为什么需要理解内存模型? 在多核处理器成为主流的今天,并发编程已成为每个Java程序员的必备技能。然而,编写正确的并发程序远比单线程程序复杂,主要原因在于我们需要处理两个核心问题:线程之间如何通信?…

完整教程:【stm32】cube固件解析和放入工程(HAL_F4)

完整教程:【stm32】cube固件解析和放入工程(HAL_F4)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

312、金缕衣

312、金缕衣312、金缕衣 唐●杜秋娘 劝君莫惜金缕衣,劝君惜取少年时。 花开堪折直须折,莫待无花空折枝。【现代诗意译】 我劝你啊 不要看重华丽衣裳 但是 一定要珍惜 青春年少美好时光花开宜折的时候 就要立即把它摘…

使用 Visual Studio 快速创建 NuGet 程序包并发布到 NuGet 官网

前言 在前面的 .NET EF Core 快速入门实战教程章节中我们创建了一个名为 EFCoreGenericRepository 的 .NET 9 通用仓储类库,今天我们来把这个 EF Core 通用仓储类库打包成 NuGet 程序包并发布到 NuGet 官网(https://…

反配容斥

反配容斥模拟赛考了这个 trick,感觉挺牛的。 直接放题。 题意 给定一个长度为 \(n\) 的序列 \(\{ a_i \}\),令全集 \(U = \{ 1,2,3,\cdots,n \}\),定义子集 \(S\) 的权值 \(g(S)=1+\oplus_{i\in S} a_i\)。 我们称集…

怎么激活win11?笔记本重装系统后怎么激活Windows?

我可以肯定99%的人并不完全了解Windows的几种激活方式,或者知其一,不知其二。 windows10 突然右下角出现激活windows? 光广告就能搜索出一大堆,必定广告是要收费的,说明市场是有的,但我这是分享的是免费使用教程…

AVG Clear:彻底卸载AVG产品的专业工具

AVG Clear是一款专业的AVG产品卸载工具,当传统卸载方式失效时,可自动扫描并彻底删除AVG相关的文件、注册表项和安装文件,确保系统完全清理。适用于Windows 10/11系统。AVG Clear 下载 立即在作者网站下载 作者: AV…

深入解析:安卓 WPS Office v18.21.0 国际版

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …