ArkUI学习-Flex

183 阅读6分钟

一、设置Flex单行布局

1、弹性布局概述

Flex容器组件属于弹性布局,提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。

  • 子元素默认沿主轴排列
  • 主轴方向默认水平方向且从左到右
  • Flex容器组件默认是单行布局
  • Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用ColumnRow代替。
  • Flex组件主轴默认不设置时撑满父容器,ColumnRow组件主轴不设置时默认是跟随子节点大小。

2、设置主轴方向:FlexDirection.Row

通过direction参数可以设置主轴的方向。

主轴为水平方向且从左到右。(默认值)

 Flex({direction:FlexDirection.Row}){ //主轴为水平方向,从左到右排布(默认值)
   //1、第一个按钮
   Button('第一个按钮')
   Button('第二个按钮')
   Button('第三个按钮')
   Button('第四个按钮')
   Button('第五个按钮')
 }

6fc12c3e0bd70fe8f0da5f9d35d5b34.png

注意:由于Flex容器组件默认是单行的,一行是放不了5个按钮的,所以按钮被压缩放到了一行。

2、FlexDirection.RowReverse

主轴为水平方向且从右到左。

Flex({direction:FlexDirection.RowReverse}){ 
  //1、第一个按钮
  Button('第一个按钮')
  Button('第二个按钮')
  Button('第三个按钮')
  Button('第四个按钮')
  Button('第五个按钮')
}

e79bf4d62821dca4322b4b7033dd8ad.png

3、FlexDirection.Column

主轴为垂直方向且从上到下。

Flex({direction:FlexDirection.Column}){
  //1、第一个按钮
  Button('第一个按钮')
  Button('第二个按钮')
  Button('第三个按钮')
  Button('第四个按钮')
  Button('第五个按钮')
}

5cfb1c6077f0e3fada40818ecdf2992.png

4、FlexDirection.ColumnReverse

主轴为垂直方向且从下到上。

Flex({direction:FlexDirection.ColumnReverse}){
  //1、第一个按钮
  Button('第一个按钮')
  Button('第二个按钮')
  Button('第三个按钮')
  Button('第四个按钮')
  Button('第五个按钮')
}

3ba34e0c392f7cd208663f74acd1a4a.png

二、设置Flex多行布局

通过wrap参数可以设置主轴的方向。

1、FlexWrap. NoWrap

单行布局。如果单行放不下子元素,则会压缩子元素。(默认值)

Flex({wrap:FlexWrap.NoWrap}){
  //1、第一个按钮
  Button('第一个按钮')
  Button('第二个按钮')
  Button('第三个按钮')
  Button('第四个按钮')
  Button('第五个按钮')
}

e48e64c00f0e1e4e4010fe6a51d92f3.png

2、FlexWrap. Wrap

多行布局,每一行子元素按照主轴方向排列。

Flex({wrap:FlexWrap.Wrap}){
  //1、第一个按钮
  Button('第一个按钮')
  Button('第二个按钮')
  Button('第三个按钮')
  Button('第四个按钮')
  Button('第五个按钮')
}

dcad44faaba7eea04ffc557f20b05fe.png

3、FlexWrap. WrapReverse

多行布局,每一行子元素按照主轴反方向排列。

Flex({wrap:FlexWrap.WrapReverse}){
  //1、第一个按钮
  Button('第一个按钮')
  Button('第二个按钮')
  Button('第三个按钮')
  Button('第四个按钮')
  Button('第五个按钮')
}

06ded49bc2ecd27653048464aa0e238.png

三、设置主轴的对齐方式

通过justifyContent参数设置在主轴方向的对齐方式。

Flex({wrap:FlexWrap.Wrap,justifyContent:FlexAlign.Start}){
  //1、第一个按钮
  Button('第一个按钮')
  Button('第二个按钮')
  Button('第三个按钮')
  Button('第四个按钮')
  Button('第五个按钮')
}

dcad44faaba7eea04ffc557f20b05fe.png 设置值:

  • FlexAlign.Start:子元素在主轴方向首端对齐。(默认值)
  • FlexAlign.Center:子元素在主轴方向居中对齐。
  • FlexAlign.End:子元素在主轴方向尾部对齐。
  • FlexAlign.SpaceBetween:子元素在主轴方向均匀分配。
  • FlexAlign.SpaceAround:子元素在主轴方向均匀分配,相邻子元素之间距离相同。第一个子元素到主轴首端的距离和最后一个子元素到主轴尾部的距离是相邻元素之间距离的一半。
  • FlexAlign.SpaceEvenly:子元素在主轴方向元素等间距布局,相邻子元素之间的间距、第一个子元素与主轴首端的距离、最后一个子元素到主轴尾部的距离均相等。

四、设置交叉轴的对齐方式

1) 单行布局的交叉轴的对齐方式

Flex容器组件通过 alignItems 参数设置单行布局中子元素在交叉轴的对齐方式。

  • ItemAlign.Auto 使用 Flex 容器中默认配置。

图片.png

ItemAlign.Start 交叉轴方向首部对齐。

图片.png

ItemAlign.Center 交叉轴方向居中对齐。

图片.png

ItemAlign.End 交叉轴方向底部对齐。

图片.png

ItemAlign.Stretch 交叉轴方向拉伸填充,拉伸到容器尺寸(前提:子元素没有设置交叉轴方向的长度)。

图片.png

ItemAlign.Baseline 交叉轴方向文本基线对齐。

图片.png

2) 多行布局的交叉轴的对齐方式

Flex容器组件通过 alignContent 参数设置子元素各行在交叉轴剩余空间内的对齐方式,只在多行的 Flex 布局中生效。

  • FlexAlign.Start:子元素各行与交叉轴起点对齐。

图片.png

  • FlexAlign.Center

子元素在主轴方向居中对齐。

  • FlexAlign.End

子元素在主轴方向尾部对齐。

  • FlexAlign.SpaceBetween

子元素在主轴方向均匀分配。

  • FlexAlign.SpaceAround

子元素在主轴方向均匀分配,相邻子元素之间距离相同。第一个子元素到主轴首端的距离和最后一个子元素到主轴尾部的距离是相邻元素之间距离的一半。

  • FlexAlign.SpaceEvenly

子元素在主轴方向元素等间距布局,相邻子元素之间的间距、第一个子元素与主轴首端的距离、最后一个子元素到主轴尾部的距离均相等。

主轴对齐方式以及参数与(Row/Column)类似

4. 设置交叉轴的对齐方式

1) 单行布局的交叉轴的对齐方式

Flex容器组件通过 alignItems 参数设置单行布局中子元素在交叉轴的对齐方式。

  • ItemAlign.Auto 使用 Flex 容器中默认配置。

  • ItemAlign.Start 交叉轴方向首部对齐。

  • ItemAlign.Center 交叉轴方向居中对齐。

  • ItemAlign.End 交叉轴方向底部对齐。

  • ItemAlign.Stretch 交叉轴方向拉伸填充,拉伸到容器尺寸(前提:子元素没有设置交叉轴方向的长度)。

  • ItemAlign.Baseline 交叉轴方向文本基线对齐。

2) 多行布局的交叉轴的对齐方式

Flex容器组件通过 alignContent 参数设置子元素各行在交叉轴剩余空间内的对齐方式,只在多行的 Flex 布局中生效。

  • FlexAlign.Start:子元素各行与交叉轴起点对齐。

  • FlexAlign.Center:子元素各行在交叉轴方向居中对齐。

图片.png

  • FlexAlign.End:子元素各行与交叉轴终点对齐。

图片.png

  • FlexAlign.SpaceBetween:子元素各行与交叉轴两端对齐,各行间垂直间距平均分布。

图片.png

  • FlexAlign.SpaceAround:子元素各行间距相等,是元素首尾行与交叉轴两端距离的两倍。

图片.png

  • FlexAlign.SpaceEvenly: 子元素各行间距、子元素首尾行与交叉轴两端距离都相等。

图片.png

3) 子元素单独设置交叉轴对齐方式

子元素通过 alignSelf 属性设置自身在父容器交叉轴的对齐方式,且会覆盖 Flex 容器组件中 alignItems 属性配置。

alignSelf 属性和alignSelf 属性的取值范围一样。

多行布局中,alignSelf 属性无效。

图片.png

五、自适应拉伸

在弹性布局Flex尺寸过大或过小,通过子组件flexShrink和flexGrow属性进行缩放,达到自适应布局能力。

flexGrow:设置“瓜分”父组件的剩余空间的放大比例。
flexShrink: 当父容器空间不足时,子组件的压缩比例。

❓弹性布局Flex如何判断其尺寸是否过大或过小?

子组件有个flexBasis属性,用来设置子组件在父容器主轴方向上的基准尺寸。如果设置了该值,则子项占用的空间为设置的值;如果没设置该属性,flexBasis值为width或height的值。Flex组件就是通过累加所有子组件的flexBasis属性值,如果大于Flex组件在主轴方向的尺寸,则过大;反之,则过小。

图片.png


参考:www.cnblogs.com/lxlx1798/ar…