ArkUI 基础组件与布局:构建响应式界面的基石
摘要:本文深入探讨 ArkUI 中的基础组件与布局,着重讲解线性布局(Column、Row)、弹性布局(Flex)、网格布局(Grid)等布局容器,通过理论阐述与 ArkTS 代码示例相结合的方式,展示如何运用这些布局容器实现高效、美观且具有响应式效果的页面排版,助力开发者更好地掌握 ArkUI 布局体系,提升应用界面开发质量。
一、引言
在 HarmonyOS 应用开发中,ArkUI 作为关键的用户界面开发框架,为开发者提供了丰富的组件和灵活的布局方式。合理运用基础组件与布局容器,是构建优质、用户体验良好的应用界面的基础。其中,线性布局、弹性布局和网格布局在页面排版中起着举足轻重的作用,它们能够适应不同设备屏幕尺寸,实现响应式布局效果,满足多样化的应用场景需求。
二、线性布局(LinearLayout)
线性布局是开发中最为常用的布局方式之一,通过线性容器 Row 和 Column 来构建。它是其他复杂布局的基础,其核心特点是子元素在线性方向上依次排列,排列方向由所选容器组件决定。
2.1 Row 容器(水平方向排列)
Row 容器内的子元素按照水平方向依次排列。例如,我们要创建一个水平排列的按钮组,可以使用如下 ArkTS 代码:
|
@Entry @Component struct RowExample { build() { Row() { Button('按钮1').width('30%').height('40px') Button('按钮2').width('30%').height('40px') Button('按钮3').width('30%').height('40px') }.width('100%').height('60px') } } |
在上述代码中,我们创建了一个 Row 容器,并在其中添加了三个 Button 组件。通过设置 Button 的宽度为百分比,以及 Row 容器的宽度为 100%,当屏幕宽度发生变化时,按钮组能够自适应屏幕宽度,保持相对比例。
2.2 Column 容器(垂直方向排列)
Column 容器内的子元素按照垂直方向依次排列。假设我们要构建一个包含标题和内容的简单布局,代码如下:
|
@Entry @Component struct ColumnExample { build() { Column() { Text('标题').fontSize(20).fontWeight(FontWeight.Bold) Text('这里是详细内容').fontSize(16) }.width('100%').padding(20) } } |
此代码中,Column 容器包含一个标题 Text 和一个内容 Text,通过设置 Column 的宽度为 100% 以及适当的内边距,使其在不同屏幕尺寸下都能合理展示。
2.3 布局属性设置
- 主轴与交叉轴:对于 Row 容器,主轴为水平方向,交叉轴为垂直方向;对于 Column 容器,主轴为垂直方向,交叉轴为水平方向。
- 间距设置:可以通过 space 属性设置子元素在排列方向上的间距。例如,在一个 Column 容器中,希望子元素之间垂直间距为 10px,可以这样设置:
|
Column() { // 子元素1 // 子元素2 // 子元素3 }.space(10) |
- 对齐方式设置:
- 交叉轴对齐:使用 alignItems 属性设置子元素在交叉轴上的对齐方式。当交叉轴为垂直方向(如 Row 容器),取值为 VerticalAlign 类型;当交叉轴为水平方向(如 Column 容器),取值为 HorizontalAlign 类型。例如,在一个 Row 容器中,使子元素在垂直方向居中对齐:
|
Row() { // 子元素 }.alignItems(VerticalAlign.Center) |
- 主轴对齐:通过 justifyContent 属性设置子元素在容器主轴上的排列方式。可以从主轴起始位置开始排布,也可以从主轴结束位置开始排布,或者均匀分割主轴的空间。比如,在一个 Column 容器中,让子元素在垂直方向均匀分布:
|
Column() { // 子元素1 // 子元素2 // 子元素3 }.justifyContent(FlexAlign.SpaceEvenly) |
三、弹性布局(Flex)
弹性布局提供了一种更加有效的方式来对容器中的子元素进行排列、对齐和分配空白空间,尤其适用于需要元素自动伸缩比例的场景。
3.1 弹性容器与弹性项目
任何一个容器都可以通过设置 display 属性的值为 flex 或 inline-flex 将其定义为弹性容器,弹性容器内的子元素自动成为弹性项目。例如:
|
@Entry @Component struct FlexExample { build() { Flex({ direction: FlexDirection.Row }) { Text('弹性项目1').width('100px').height('100px').backgroundColor(Color.Red) Text('弹性项目2').width('100px').height('100px').backgroundColor(Color.Green) Text('弹性项目3').width('100px').height('100px').backgroundColor(Color.Blue) }.width('100%').height('150px') } } |
在上述代码中,我们创建了一个 Flex 容器,并设置其主轴方向为水平(FlexDirection.Row),在容器内添加了三个弹性项目(Text 组件)。
3.2 关键属性
- flexDirection:决定主轴的方向,取值包括 Row(默认,主轴为水平方向,起点在左端)、RowReverse(主轴为水平方向,起点在右端)、Column(主轴为垂直方向,起点在上沿)、ColumnReverse(主轴为垂直方向,起点在下沿)。例如,将主轴方向设置为垂直:
|
Flex({ direction: FlexDirection.Column }) { // 子元素 } |
- flexWrap:定义如果一条轴线排不下,如何换行。取值有 nowrap(默认,不换行)、wrap(换行,第一行在上方)、wrapReverse(换行,第一行在下方)。例如,设置为换行:
|
Flex({ direction: FlexDirection.Row, wrap: FlexWrap.Wrap }) { // 子元素 } |
- justifyContent:定义项目在主轴上的对齐方式,取值有 flexStart(默认值,左对齐)、flexEnd(右对齐)、center(居中)、spaceBetween(两端对齐,项目之间的间隔都相等)、spaceAround(每个项目两侧的间隔相等,项目之间的间隔比项目与边框的间隔大一倍)、spaceEvenly(项目与项目之间,项目与边框之间的间隔都相等)。例如,使项目在主轴上居中对齐:
|
Flex({ direction: FlexDirection.Row }) { // 子元素 }.justifyContent(FlexAlign.Center) |
- alignItems:定义项目在交叉轴上如何对齐,取值有 flexStart(子元素在交叉轴上顶部对齐)、center(子元素在交叉轴上居中对齐)、stretch(子元素在交叉轴上拉伸,占满容器的交叉轴高度)等。例如,让子元素在交叉轴上居中对齐:
|
Flex({ direction: FlexDirection.Row }) { // 子元素 }.alignItems(FlexAlign.Center) |
四、网格布局(Grid)
CSS Grid 布局是一种二维布局模型,ArkUI 中的网格布局与之类似,允许开发者通过定义行和列来创建复杂的网格结构,使元素的排列更加灵活和简便。
4.1 网格容器与网格项目
通过将 display 属性设置为 grid 或 inline - grid 创建网格容器,网格容器的直接子元素即为网格项目。例如:
|
@Entry @Component struct GridExample { build() { Grid({ columns: '1fr 1fr 1fr', rows: '1fr 1fr' }) { Text('网格项目1').backgroundColor(Color.Red) Text('网格项目2').backgroundColor(Color.Green) Text('网格项目3').backgroundColor(Color.Blue) Text('网格项目4').backgroundColor(Color.Yellow) Text('网格项目5').backgroundColor(Color.Purple) Text('网格项目6').backgroundColor(Color.Orange) }.width('100%').height('300px') } } |
在这段代码中,我们创建了一个网格容器,通过 columns 属性定义了三列,每列宽度为 1fr(表示平均分配剩余空间),通过 rows 属性定义了两行,每行高度为 1fr。
4.2 重要属性
- gridTemplateColumns:定义网格的列,可以使用数值(px、%、fr)、关键字(auto)或重复关键字(repeat ())设置列宽。例如,定义两列,一列宽度为 200px,另一列自适应剩余空间:
|
Grid({ columns: '200px 1fr' }) { // 子元素 } |
- gridTemplateRows:定义网格的行,与 gridTemplateColumns 类似。例如,定义三行,高度分别为 100px、auto、1fr:
|
Grid({ rows: '100px auto 1fr' }) { // 子元素 } |
- gridColumnGap / gridRowGap:用于设置列和行之间的间隔。例如,设置列间隔为 20px,行间隔为 10px:
|
Grid({ columns: '1fr 1fr 1fr', rows: '1fr 1fr', columnGap: 20, rowGap: 10 }) { // 子元素 } |
- gridColumnStart 和 gridColumnEnd:定义项目在网格列中的起始和结束位置。例如,让一个网格项目跨越两列:
|
Grid({ columns: '1fr 1fr 1fr', rows: '1fr 1fr' }) { Text('跨越两列的项目').gridColumnStart(1).gridColumnEnd(3).backgroundColor(Color.Gray) // 其他子元素 } |
- gridRowStart 和 gridRowEnd:定义项目在网格行中的起始和结束位置,用法与列的类似。
五、响应式布局实现
响应式布局是指页面能够根据不同设备屏幕尺寸自动调整布局和样式,提供良好的用户体验。在 ArkUI 中,利用上述布局容器可以轻松实现响应式布局。
5.1 基于百分比的布局
在各种布局容器中,使用百分比设置子元素的宽度和高度是实现响应式布局的基础方法。例如,在线性布局中,通过设置 Row 或 Column 容器的子元素宽度为百分比,当屏幕尺寸变化时,子元素会按比例自动调整大小。
|
@Entry @Component struct ResponsiveLinearLayout { build() { Column() { Text('占50%宽度').width('50%').height('50px').backgroundColor(Color.LightBlue) Text('占另外50%宽度').width('50%').height('50px').backgroundColor(Color.LightGreen) }.width('100%') } } |
5.2 媒体查询
ArkUI 支持媒体查询,通过媒体查询可以根据设备的屏幕宽度、高度等条件应用不同的样式和布局。例如:
|
@Entry @Component struct ResponsiveLayout { build() { Flex({ direction: FlexDirection.Row }) { if (Device.width < 600) { // 小屏幕设备,显示一列 Column() { Text('内容1').width('100%').height('100px').backgroundColor(Color.Red) Text('内容2').width('100%').height('100px').backgroundColor(Color.Green) } } else { // 大屏幕设备,显示两列 Text('内容1').width('50%').height('100px').backgroundColor(Color.Red) Text('内容2').width('50%').height('100px').backgroundColor(Color.Green) } }.width('100%') } } |
在上述代码中,根据设备屏幕宽度是否小于 600px,应用了不同的布局方式,实现了响应式效果。
六、结论
线性布局、弹性布局和网格布局是 ArkUI 中构建页面布局的重要工具,它们各自具有独特的特点和适用场景。线性布局适用于简单的线性排列场景,弹性布局在元素需要自动伸缩比例时表现出色,网格布局则擅长处理复杂的二维布局。通过合理运用这些布局容器,并结合百分比布局、媒体查询等技术,开发者能够轻松实现响应式布局,为不同设备的用户提供一致、优质的应用界面体验。在实际开发中,应根据具体需求灵活选择和组合这些布局方式,不断优化应用界面的布局与设计,提升应用的整体质量和用户满意度。
1017

被折叠的 条评论
为什么被折叠?



