HarmonyOS应用开发——线性布局
在 HarmonyOS 应用开发的世界里,界面布局如同搭建高楼大厦的框架,决定着用户与应用交互的第一印象和使用体验。合理的布局不仅能让界面元素整齐有序、美观协调,还能适应不同设备的屏幕尺寸和分辨率。本文将深入剖析 HarmonyOS 中的常见布局方式,帮助开发者打造出出色的应用界面。
前置条件
在开始本文章内容之前,博主希望开发者已完成 HarmonyOS 开发环境 的搭建。详情请参考:HarmonyOS 开发环境搭建
线性布局(DirectionalLayout)
应用场景:
- 如果布局内子元素超过1个时,且能够以某种方式线性排列时优先考虑此布局。
线性布局(LinearLayout)是开发中最常用的布局,通过线性容器 Row 和 Column 构建。线性布局是其他布局的基础,其子元素在线性方向上(水平方向和垂直方向)依次排列。
线性布局 的排列方向由所选容器组件决定,Row容器内子元素按照水平方向排列,Column容器内子元素按照垂直方向排列。
根据不同的排列方向,开发者可选择使用Row或Column容器创建线性布局。
@Entry
@Component
struct Index {build() {RelativeContainer() {// 线性布局 [Column 为垂直线性容器]Column({ space: 20 }) {// 线性布局 [Row 为水平线性容器]Row({ space: 35 }) {Text('space: 35').fontSize(15).fontColor(Color.Gray)Text('space: 35').fontSize(15).fontColor(Color.Gray)Text('space: 35').fontSize(15).fontColor(Color.Gray)}.width('90%').height(50).backgroundColor(0xF5DEB3)Row({ space: 35 }) {Text('space: 35').fontSize(15).fontColor(Color.Gray)Text('space: 35').fontSize(15).fontColor(Color.Gray)Text('space: 35').fontSize(15).fontColor(Color.Gray)}.width('90%').height(50).backgroundColor(0xF5DEB3)}.width('100%').height('120px').justifyContent(FlexAlign.Start)}.height('100%').width('100%')}
}
布局子元素在主轴上的排列方式
参数 | 说明 |
space | 在布局容器内,可以通过space属性设置排列方向上子元素的间距,使各子元素在排列方向上有等间距效果。 |
justifyContent | 在布局容器内,可以通过justifyContent属性设置子元素在容器主轴上的排列方式。可以从主轴起始位置开始排布,也可以从主轴结束位置开始排布,或者均匀分割主轴的空间。 |
属性 | 说明 |
FlexAlign.Start | 元素在 垂直方向 首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐。 |
FlexAlign.Center | 元素在 垂直方向 中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同。 |
FlexAlign.End | 元素在 垂直方向 尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐。 |
FlexAlign.SpaceBetween | 垂直方向 均匀分配元素,相邻元素之间距离相同。第一个元素与行首对齐,最后一个元素与行尾对齐。 |
FlexAlign.SpaceAround | 垂直方向 均匀分配元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。 |
FlexAlign.SpaceEvenly | 垂直方向 均匀分配元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样。 |
Row容器内子元素在水平方向上的排列
属性 | 说明 |
FlexAlign.Start | 元素在 水平方向 首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐。 |
FlexAlign.Center | 元素在 水平方向 中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同。 |
FlexAlign.End | 元素在 水平方向 尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐。 |
FlexAlign.SpaceBetween | 水平方向 均匀分配元素,相邻元素之间距离相同。第一个元素与行首对齐,最后一个元素与行尾对齐。 |
FlexAlign.SpaceAround | 水平方向 均匀分配元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。 |
FlexAlign.SpaceEvenly | 水平方向 均匀分配元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样。 |
布局子元素在交叉轴上的对齐方式
参数 | 说明 |
alignItems | 在布局容器内,可以通过alignItems属性设置子元素在交叉轴(排列方向的垂直方向)上的对齐方式,且在各类尺寸屏幕中表现一致。其中,交叉轴为垂直方向时,取值为VerticalAlign类型,水平方向取值为HorizontalAlign类型。 |
Column容器内子元素在水平方向上的排列
参数 | 说明 |
HorizontalAlign.Start | 子元素在水平方向左对齐。 |
HorizontalAlign.Center | 子元素在水平方向居中对齐。 |
HorizontalAlign.End | 子元素在水平方向右对齐。 |
Row容器内子元素在垂直方向上的排列
参数 | 说明 |
VerticalAlign.Top | 子元素在垂直方向顶部对齐。 |
VerticalAlign.Center | 子元素在垂直方向居中对齐。 |
VerticalAlign.Bottom | 子元素在垂直方向底部对齐。 |
自适应拉伸
在线性布局下,常用空白填充组件Blank,在容器主轴方向自动填充空白空间,达到自适应拉伸效果。Row 和 Column 作为容器,只需要添加宽高为百分比,当屏幕宽高发生变化时,会产生自适应效果。
@Entry
@Component
struct BlankExample {build() {Column() {Row() {Text('Bluetooth').fontSize(18)Blank()Toggle({ type: ToggleType.Switch, isOn: true })}.backgroundColor(0xFFFFFF).borderRadius(15).padding({ left: 12 }).width('100%')}.backgroundColor(0xEFEFEF).padding(20).width('100%')}
}
自适应缩放
自适应缩放是指子元素随容器尺寸的变化而按照预设的比例自动调整尺寸,适应各种不同大小的设备。在线性布局中,可以使用以下两种方法实现自适应缩放。
- 父容器尺寸确定时,使用layoutWeight属性设置子元素和兄弟元素在主轴上的权重,忽略元素本身尺寸设置,使它们在任意尺寸的设备下自适应占满剩余空间。
- 父容器尺寸确定时,使用百分比设置子元素和兄弟元素的宽度,使他们在任意尺寸的设备下保持固定的自适应占比。
自适应延伸
自适应延伸是指在不同尺寸设备下,当页面的内容超出屏幕大小而无法完全显示时,可以通过滚动条进行拖动展示。对于线性布局,这种方法适用于容器中内容无法一屏展示的场景。通常有以下两种实现方式。
-
在List中添加滚动条:当List子项过多一屏放不下时,可以将每一项子元素放置在不同的组件中,通过滚动条进行拖动展示。可以通过scrollBar属性设置滚动条的常驻状态,edgeEffect属性设置拖动到内容最末端的回弹效果。
-
使用Scroll组件:在线性布局中,开发者可以进行垂直方向或者水平方向的布局。当一屏无法完全显示时,可以在Column或Row组件的外层包裹一个可滚动的容器组件Scroll来实现可滑动的线性布局。
垂直方向布局中使用Scroll组件:
@Entry
@Component
struct ScrollExample {scroller: Scroller = new Scroller();private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];build() {Scroll(this.scroller) {Column() {ForEach(this.arr, (item?:number|undefined) => {if(item){Text(item.toString()).width('90%').height(150).backgroundColor(0xFFFFFF).borderRadius(15).fontSize(16).textAlign(TextAlign.Center).margin({ top: 10 })}}, (item:number) => item.toString())}.width('100%')}.backgroundColor(0xDCDCDC).scrollable(ScrollDirection.Vertical) // 滚动方向为垂直方向.scrollBar(BarState.On) // 滚动条常驻显示.scrollBarColor(Color.Gray) // 滚动条颜色.scrollBarWidth(10) // 滚动条宽度.edgeEffect(EdgeEffect.Spring) // 滚动到边沿后回弹}
}
水平方向布局中使用Scroll组件:
@Entry
@Component
struct ScrollExample {scroller: Scroller = new Scroller();private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];build() {Scroll(this.scroller) {Row() {ForEach(this.arr, (item?:number|undefined) => {if(item){Text(item.toString()).height('90%').width(150).backgroundColor(0xFFFFFF).borderRadius(15).fontSize(16).textAlign(TextAlign.Center).margin({ left: 10 })}})}.height('100%')}.backgroundColor(0xDCDCDC).scrollable(ScrollDirection.Horizontal) // 滚动方向为水平方向.scrollBar(BarState.On) // 滚动条常驻显示.scrollBarColor(Color.Gray) // 滚动条颜色.scrollBarWidth(10) // 滚动条宽度.edgeEffect(EdgeEffect.Spring) // 滚动到边沿后回弹}
}
以上详细介绍了 HarmonyOS 的线性布局在实战中的使用方式。若你在实际开发中遇到问题,或想了解某类布局的更多进阶用法,欢迎随时和我交流。