HarmonyOS学习第10天: 解锁线性布局的魔法排列

线性布局初相识

在 HarmonyOS 开发的奇妙旅程中,界面布局就像是搭建房屋的基石,而线性布局(LinearLayout)无疑是其中最为常用且基础的一块。它是构建有序界面排列的关键,通过线性容器 Row 和 Column,能够让子元素在水平或垂直方向上依次排列,为我们打造出简洁、规整的用户界面。无论是简单的登录页面,还是复杂的应用主界面,线性布局都能发挥重要作用,帮助我们将各种组件合理地组织在一起,提升用户体验。今天,就让我们深入探索线性布局的奥秘,掌握它的使用技巧,为 HarmonyOS 应用开发添砖加瓦。

线性布局的基础原理

(一)布局容器与排列方向

在 HarmonyOS 中,线性布局主要通过 Row 和 Column 这两个容器组件来实现。Row 容器就像是一条水平的轨道,所有放置在其中的子组件会从左到右依次排列,如同在书架上摆放书籍,一本挨着一本从左向右排列。比如,我们要创建一个简单的导航栏,其中包含多个图标和文字按钮,就可以使用 Row 容器将这些图标和按钮水平排列,让用户能够方便地点击切换不同功能。而 Column 容器则是垂直方向的布局能手,它会让子组件从上到下有序排列,就像一列纵队,士兵们依次站列。以登录页面为例,用户名输入框、密码输入框以及登录按钮通常会垂直排列,此时 Column 容器就能派上用场,将这些组件按顺序从上至下布局,使页面看起来整齐规范。

(二)主轴与交叉轴

理解主轴和交叉轴是掌握线性布局的关键。主轴是线性布局中决定子组件排列方向的轴线,而交叉轴则是与主轴垂直的轴线。在 Row 容器中,由于子组件是水平排列的,所以水平方向就是主轴,就像火车行驶的铁轨方向;而垂直方向则是交叉轴,如同铁轨旁的电线杆的排列方向。在 Column 容器里,情况恰好相反,垂直方向成为主轴,因为子组件是垂直排列的;水平方向则是交叉轴。例如,在一个包含多个图片和文字描述的界面中,如果使用 Row 容器来布局图片和文字,那么图片和文字在水平方向上的排列就是沿着主轴方向,而它们在垂直方向上的对齐方式则与交叉轴相关;若使用 Column 容器,图片和文字在垂直方向上依次排列是主轴方向,水平方向的对齐就是基于交叉轴。通过对主轴和交叉轴的理解,我们能够更精准地控制子组件在布局中的位置和排列方式 。

线性布局的使用方法

(一)组件排列

水平排列:使用 Row 容器实现水平排列非常简单。以下是一个代码示例,展示了如何在 Row 容器中放置三个 Text 组件,让它们从左到右依次排列 。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct HorizontalLayout { build() { Row() { Text('组件1') .fontSize(16) .backgroundColor(Color.LightGray) Text('组件2') .fontSize(16) .backgroundColor(Color.LightBlue) Text('组件3') .fontSize(16) .backgroundColor(Color.LightGreen) } .width('100%') .height(100) } } |

在上述代码中,Row 容器包裹了三个 Text 组件,每个 Text 组件设置了不同的背景颜色以便区分,并且设置了字体大小。Row 容器设置了宽度为父容器的 100%,高度为 100,这样三个 Text 组件就会在水平方向上依次排列,填满 Row 容器的宽度 。运行效果为三个带有不同背景颜色的文本组件水平排列在页面上。

垂直排列:Column 容器用于实现组件的垂直排列。下面的代码示例创建了一个包含三个按钮的 Column 布局,按钮将从上到下依次排列。

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct VerticalLayout { build() { Column() { Button('按钮1') .width(150) .height(50) .backgroundColor(Color.Orange) Button('按钮2') .width(150) .height(50) .backgroundColor(Color.Pink) Button('按钮3') .width(150) .height(50) .backgroundColor(Color.Yellow) } .width('100%') .height('100%') } } |

这段代码中,Column 容器包含了三个 Button 组件,每个按钮设置了宽度、高度和背景颜色。Column 容器设置了宽度为父容器的 100%,高度也为父容器的 100%,使得按钮能够在垂直方向上依次排列,占据整个 Column 容器的空间 。运行结果是三个不同颜色的按钮垂直排列在页面中。

(二)间距设置

在实际应用中,为了让组件之间的布局更加美观,我们常常需要设置组件间的间距。在 HarmonyOS 的线性布局中,可以通过 space 属性轻松实现这一需求。space 属性可以设置为一个数值(单位为 vp,虚拟像素),表示子组件之间的固定间距。例如,在以下代码中,我们在 Row 容器中设置 space 为 20,让三个 Text 组件之间有 20vp 的间距。

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct SpacingExample { build() { Row({ space: 20 }) { Text('文本1') .fontSize(16) .backgroundColor(Color.LightGray) Text('文本2') .fontSize(16) .backgroundColor(Color.LightBlue) Text('文本3') .fontSize(16) .backgroundColor(Color.LightGreen) } .width('100%') .height(100) } } |

在上述代码中,Row 容器的 space 属性设置为 20,这使得三个 Text 组件在水平排列时,彼此之间会有 20vp 的空白间隔。同样,在 Column 容器中也可以使用 space 属性来设置子组件在垂直方向上的间距。比如:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct ColumnSpacingExample { build() { Column({ space: 15 }) { Button('按钮A') .width(150) .height(50) .backgroundColor(Color.Orange) Button('按钮B') .width(150) .height(50) .backgroundColor(Color.Pink) Button('按钮C') .width(150) .height(50) .backgroundColor(Color.Yellow) } .width('100%') .height('100%') } } |

这段代码中,Column 容器的 space 属性设置为 15,因此三个按钮在垂直排列时,它们之间会有 15vp 的垂直间距,使布局看起来更加舒适、整齐 。

(三)对齐方式

水平对齐:在 Row 容器中,子组件在垂直方向(交叉轴)上的对齐方式由 VerticalAlign 枚举值控制。VerticalAlign 枚举主要包含以下几个值:

VerticalAlign.Top:子组件在交叉轴上顶部对齐。

VerticalAlign.Center:子组件在交叉轴上居中对齐,这是默认的对齐方式。

VerticalAlign.Bottom:子组件在交叉轴上底部对齐。

以下是不同对齐方式的代码示例及效果展示:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct HorizontalAlignExample { build() { Column() { // 顶部对齐示例 Row() { Text('短文本') .fontSize(16) .backgroundColor(Color.LightGray) .width(100) .height(50) Text('很长很长的文本') .fontSize(16) .backgroundColor(Color.LightBlue) .width(150) .height(80) } .width('100%') .height(100) .alignItems(VerticalAlign.Top) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 居中对齐示例 Row() { Text('短文本') .fontSize(16) .backgroundColor(Color.LightGray) .width(100) .height(50) Text('很长很长的文本') .fontSize(16) .backgroundColor(Color.LightBlue) .width(150) .height(80) } .width('100%') .height(100) .alignItems(VerticalAlign.Center) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 底部对齐示例 Row() { Text('短文本') .fontSize(16) .backgroundColor(Color.LightGray) .width(100) .height(50) Text('很长很长的文本') .fontSize(16) .backgroundColor(Color.LightBlue) .width(150) .height(80) } .width('100%') .height(100) .alignItems(VerticalAlign.Bottom) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) } .width('100%') .height('100%') } } |

在上述代码中,通过设置 Row 容器的 alignItems 属性为不同的 VerticalAlign 枚举值,实现了子组件在垂直方向上的不同对齐效果。每个 Row 容器都设置了边框和外边距,方便区分不同的示例。在实际效果中,可以看到当设置为 VerticalAlign.Top 时,两个文本组件的顶部对齐;设置为 VerticalAlign.Center 时,它们在垂直方向上居中对齐;设置为 VerticalAlign.Bottom 时,文本组件的底部对齐 。

垂直对齐:对于 Column 容器,子组件在水平方向(交叉轴)上的对齐方式由 HorizontalAlign 枚举值决定。HorizontalAlign 枚举主要有:

HorizontalAlign.Start:子组件在交叉轴上起始端对齐(对于从左到右的语言,就是左对齐)。

HorizontalAlign.Center:子组件在交叉轴上居中对齐。

HorizontalAlign.End:子组件在交叉轴上末端对齐(对于从左到右的语言,就是右对齐)。

下面是不同垂直对齐方式的代码和效果展示:

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct VerticalAlignExample { build() { Column() { // 左对齐示例 Column() { Text('内容1') .fontSize(16) .backgroundColor(Color.LightGray) .width(100) .height(50) Text('内容2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(150) .height(50) } .width('100%') .height(120) .alignItems(HorizontalAlign.Start) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 居中对齐示例 Column() { Text('内容1') .fontSize(16) .backgroundColor(Color.LightGray) .width(100) .height(50) Text('内容2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(150) .height(50) } .width('100%') .height(120) .alignItems(HorizontalAlign.Center) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 右对齐示例 Column() { Text('内容1') .fontSize(16) .backgroundColor(Color.LightGray) .width(100) .height(50) Text('内容2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(150) .height(50) } .width('100%') .height(120) .alignItems(HorizontalAlign.End) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) } .width('100%') .height('100%') } } |

在这段代码中,通过修改 Column 容器的 alignItems 属性为不同的 HorizontalAlign 枚举值,展示了子组件在水平方向上的不同对齐方式。从实际效果可以清晰地看到,设置为 HorizontalAlign.Start 时,文本组件左对齐;设置为 HorizontalAlign.Center 时,居中对齐;设置为 HorizontalAlign.End 时,右对齐 。

(四)排列方式

水平方向排列:在 Row 容器中,通过 justifyContent 属性可以控制子组件在水平方向(主轴)上的排列方式,该属性的值来自 FlexAlign 枚举。FlexAlign 枚举包含以下常见值:

FlexAlign.Start:子组件在主轴上首端对齐,即从左到右排列时,子组件靠左侧对齐。

FlexAlign.Center:子组件在主轴上居中对齐。

FlexAlign.End:子组件在主轴上尾端对齐,即从左到右排列时,子组件靠右侧对齐。

FlexAlign.SpaceBetween:子组件在主轴上两端对齐,且子组件之间的间距相等。

FlexAlign.SpaceAround:子组件在主轴上均匀分布,每个子组件周围的间距相等(包括容器边缘与第一个和最后一个子组件的间距)。

FlexAlign.SpaceEvenly:子组件在主轴上均匀分布,且子组件之间以及子组件与容器边缘的间距都相等。

以下是水平方向不同排列方式的代码示例及效果展示:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct HorizontalArrangementExample { build() { Column() { // 首端对齐 Row({ justifyContent: FlexAlign.Start }) { Text('元素1') .fontSize(16) .backgroundColor(Color.LightGray) .width(80) .height(50) Text('元素2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(80) .height(50) Text('元素3') .fontSize(16) .backgroundColor(Color.LightGreen) .width(80) .height(50) } .width('100%') .height(80) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 居中对齐 Row({ justifyContent: FlexAlign.Center }) { Text('元素1') .fontSize(16) .backgroundColor(Color.LightGray) .width(80) .height(50) Text('元素2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(80) .height(50) Text('元素3') .fontSize(16) .backgroundColor(Color.LightGreen) .width(80) .height(50) } .width('100%') .height(80) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 尾端对齐 Row({ justifyContent: FlexAlign.End }) { Text('元素1') .fontSize(16) .backgroundColor(Color.LightGray) .width(80) .height(50) Text('元素2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(80) .height(50) Text('元素3') .fontSize(16) .backgroundColor(Color.LightGreen) .width(80) .height(50) } .width('100%') .height(80) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 两端对齐,元素之间等间距 Row({ justifyContent: FlexAlign.SpaceBetween }) { Text('元素1') .fontSize(16) .backgroundColor(Color.LightGray) .width(80) .height(50) Text('元素2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(80) .height(50) Text('元素3') .fontSize(16) .backgroundColor(Color.LightGreen) .width(80) .height(50) } .width('100%') .height(80) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 元素周围等间距 Row({ justifyContent: FlexAlign.SpaceAround }) { Text('元素1') .fontSize(16) .backgroundColor(Color.LightGray) .width(80) .height(50) Text('元素2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(80) .height(50) Text('元素3') .fontSize(16) .backgroundColor(Color.LightGreen) .width(80) .height(50) } .width('100%') .height(80) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) // 元素之间及两端等间距 Row({ justifyContent: FlexAlign.SpaceEvenly }) { Text('元素1') .fontSize(16) .backgroundColor(Color.LightGray) .width(80) .height(50) Text('元素2') .fontSize(16) .backgroundColor(Color.LightBlue) .width(80) .height(50) Text('元素3') .fontSize(16) .backgroundColor(Color.LightGreen) .width(80) .height(50) } .width('100%') .height(80) .border({ width: 1, color: Color.Black }) .margin({ top: 20 }) } .width('100%') .height('100%') } } |

通过上述代码,我们可以直观地看到不同 FlexAlign 值下子组件在水平方向上的排列效果。例如,当设置为 FlexAlign.SpaceBetween 时,三个元素会分别靠左右两端和中间均匀分布;设置为 FlexAlign.SpaceAround 时,元素周围的空白间距相等;设置为 FlexAlign.SpaceEvenly 时,元素之间以及与容器边缘的间距都相等 。

垂直方向排列:在 Column 容器中,同样

权重分配技巧

(一)layoutWeight 属性

在 HarmonyOS 的线性布局中,权重分配是一项非常实用的技巧,它能让我们更灵活地控制子组件在布局中的大小比例。权重分配主要通过 layoutWeight 属性来实现 。layoutWeight 属性是一个浮点数值,用于表示组件在布局中的相对权重。当多个子组件都设置了 layoutWeight 属性时,系统会根据这些权重值来分配剩余空间。简单来说,layoutWeight 属性决定了组件在布局中所占用的空间大小。设置的 layoutWeight 值越大,组件所占用的空间也就越大;相反,值越小,组件所占用的空间也就越小。例如,在一个水平方向的 Row 布局中,有两个子组件 A 和 B,若 A 的 layoutWeight 设为 1,B 的 layoutWeight 设为 2,那么在分配剩余空间时,B 将获得 A 两倍的空间 。

(二)权重分配示例

以下是一个详细的代码示例,展示如何在 HarmonyOS 中使用权重分配。在这个例子中,我们创建一个包含三个 Column 组件的 Row 布局,每个 Column 组件设置不同的 layoutWeight 值,来观察它们的大小变化效果 。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct LayoutWeightExample { build() { Column() { Text('权重比例 1:2:3') .width('100%') .fontSize(18) .textAlign(TextAlign.Center) .margin({ top: 20 }) Row() { Column() { Text('权重为1') .textAlign(TextAlign.Center) .backgroundColor(Color.LightGray) } .layoutWeight(1) .height(150) Column() { Text('权重为2') .textAlign(TextAlign.Center) .backgroundColor(Color.LightBlue) } .layoutWeight(2) .height(150) Column() { Text('权重为3') .textAlign(TextAlign.Center) .backgroundColor(Color.LightGreen) } .layoutWeight(3) .height(150) } .width('100%') .height(200) .backgroundColor(Color.White) .margin({ top: 10 }) .border({ width: 1, color: Color.Black }) Text('权重比例 3:1:2') .width('100%') .fontSize(18) .textAlign(TextAlign.Center) .margin({ top: 20 }) Row() { Column() { Text('权重为3') .textAlign(TextAlign.Center) .backgroundColor(Color.LightGray) } .layoutWeight(3) .height(150) Column() { Text('权重为1') .textAlign(TextAlign.Center) .backgroundColor(Color.LightBlue) } .layoutWeight(1) .height(150) Column() { Text('权重为2') .textAlign(TextAlign.Center) .backgroundColor(Color.LightGreen) } .layoutWeight(2) .height(150) } .width('100%') .height(200) .backgroundColor(Color.White) .margin({ top: 10 }) .border({ width: 1, color: Color.Black }) } .width('100%') .height('100%') .backgroundColor(Color.LightYellow) } } |

在上述代码中,第一个 Row 布局内的三个 Column 组件权重比例为 1:2:3,运行效果可以看到,权重为 3 的 Column 组件占据的宽度最大,权重为 1 的 Column 组件占据宽度最小。第二个 Row 布局中,Column 组件的权重比例变为 3:1:2,此时权重为 3 的 Column 组件宽度再次发生变化,成为最宽的组件,而权重为 1 的 Column 组件宽度最小 。通过这个示例,我们可以清晰地看到不同权重比例下,组件在布局中的大小变化情况,灵活运用权重分配技巧,能够满足各种复杂的界面布局需求 。

案例实战

(一)简单登录页面布局

现在,让我们通过一个实际的案例 ------ 构建一个简单的登录页面,来更深入地理解线性布局的应用。登录页面是许多应用程序的基础界面,它通常包含用户名输入框、密码输入框和登录按钮。使用线性布局,我们可以轻松地实现这样一个布局。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @Entry @Component struct LoginPage { @State username: string = ''; @State password: string = ''; build() { Column() { // 标题 Text('用户登录') .fontSize(24) .fontWeight(FontWeight.Bold) .textAlign(TextAlign.Center) .width('100%') .margin({ top: 30 }) // 用户名输入框 Row({ space: 10 }) { Text('用户名:') .fontSize(16) .width(80) TextInput({ placeholder: '请输入用户名' }) .width('60%') .height(40) .onChange((value: string) => { this.username = value; }) } .width('100%') .margin({ top: 20 }) // 密码输入框 Row({ space: 10 }) { Text('密码:') .fontSize(16) .width(80) TextInput({ placeholder: '请输入密码' }) .width('60%') .height(40) .password(true) .onChange((value: string) => { this.password = value; }) } .width('100%') .margin({ top: 20 }) // 登录按钮 Button('登录') .width('50%') .height(40) .backgroundColor(Color.Blue) .fontSize(16) .textColor(Color.White) .margin({ top: 30 }) .onClick(() => { if (this.username === '' || this.password === '') { console.log('用户名或密码不能为空'); return; } console.log('登录成功,用户名:', this.username, '密码:', this.password); }) } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) .alignItems(HorizontalAlign.Center) } } |

在上述代码中,我们使用 Column 容器作为最外层布局,因为我们希望标题、输入框和按钮在垂直方向上依次排列。Column 容器设置了宽度为父容器的 100%,高度为 100%,并通过 justifyContent 属性将子组件在垂直方向上居中对齐,通过 alignItems 属性将子组件在水平方向上居中对齐 。

在 Column 容器内部,首先是一个 Text 组件作为页面标题,设置了较大的字体大小和加粗样式,并居中显示。然后,通过两个 Row 容器分别放置用户名和密码输入框相关的 Text 和 TextInput 组件。每个 Row 容器设置了子组件之间的间距为 10,并且用户名和密码的 Text 组件设置了固定宽度,TextInput 组件设置了宽度为父容器的 60%,以适应不同屏幕尺寸。最后,登录按钮使用 Button 组件实现,设置了宽度为 50%,高度为 40,背景颜色为蓝色,文字颜色为白色,并且添加了点击事件处理函数,用于验证用户名和密码是否为空,并在控制台输出登录信息 。

(二)分析与总结

通过这个简单登录页面的案例,我们可以看到线性布局在实际应用中的便利性和灵活性。线性布局能够快速地将组件按照水平或垂直方向排列,使得界面结构清晰、易于理解和维护。在这个案例中,Column 容器和 Row 容器的配合使用,很好地实现了登录页面的布局需求。

同时,我们也注意到一些在使用线性布局时的要点。例如,合理设置组件的宽度、高度以及对齐方式非常重要,这直接影响到界面的美观和用户体验。在设置组件宽度时,我们可以使用百分比来实现响应式布局,让界面在不同屏幕尺寸下都能保持良好的显示效果。另外,在处理输入框和按钮等交互组件时,要确保它们的大小和位置易于用户操作 。

此外,对于更复杂的登录页面,可能还需要添加更多的组件,如记住密码选项、忘记密码链接等。此时,仍然可以通过线性布局的嵌套和属性设置来实现。例如,可以在用户名和密码输入框的 Row 容器下方再添加一个 Row 容器,用于放置记住密码的 CheckBox 和忘记密码的 Text 组件,并设置合适的排列方式和对齐方式 。总之,掌握线性布局的原理和使用方法,是构建优秀 HarmonyOS 应用界面的重要基础,通过不断实践和总结,我们能够更加熟练地运用它来实现各种复杂的界面布局。

总结与展望

通过今天对 HarmonyOS 线性布局的深入学习,我们掌握了线性布局的基础原理,包括布局容器 Row 和 Column 的使用,以及主轴和交叉轴的概念。在使用方法上,学会了如何进行组件排列、间距设置、对齐方式和排列方式的调整,这些技能将帮助我们打造出美观、整齐的界面布局。同时,权重分配技巧的学习,让我们能够更灵活地控制子组件的大小比例,满足各种复杂的布局需求 。

线性布局是 HarmonyOS 应用开发中不可或缺的基础技能,它的应用场景广泛,无论是简单的界面还是复杂的应用架构,都能发挥重要作用。希望大家在今后的学习和实践中,不断练习和运用线性布局,将其与其他布局方式相结合,创造出更加出色的 HarmonyOS 应用界面 。在后续的学习中,我们还将探索更多关于 HarmonyOS 开发的知识和技巧,敬请期待!

相关推荐
茯苓gao2 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
爱笑的眼睛112 小时前
HarmonyOS 应用开发新范式:深入探索 Stage 模型与 ArkUI 声明式开发
华为·harmonyos
是誰萆微了承諾3 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT3 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa3 小时前
HTML和CSS学习
前端·css·学习·html
看海天一色听风起雨落4 小时前
Python学习之装饰器
开发语言·python·学习
speop5 小时前
llm的一点学习笔记
笔记·学习
非凡ghost6 小时前
FxSound:提升音频体验,让音乐更动听
前端·学习·音视频·生活·软件需求
ue星空6 小时前
月2期学习笔记
学习·游戏·ue5
萧邀人6 小时前
第二课、熟悉Cocos Creator 编辑器界面
学习