Flex
容器组件属于弹性布局,提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。
Flex
容器组件默认是单行布局@Entry
@Component
struct FlexLayout {
build() {
Flex() {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
}
}
ps:由于Flex容器组件默认是单行的,一行是放不了4个按钮的,所以按钮被压缩放到了一行。
通过direction
参数可以设置主轴的方向。
@Entry
@Component
struct FlexLayout {
build() {
Flex({direction: FlexDirection.RowReverse}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
}
}
@Entry
@Component
struct FlexLayout {
build() {
Flex({direction: FlexDirection.Column}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
}
}
通过wrap
参数可以设置主轴的方向。
@Entry
@Component
struct FlexLayout {
build() {
Flex({wrap: FlexWrap.Wrap}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
}
}
@Entry
@Component
struct FlexLayout {
build() {
Flex({wrap: FlexWrap.WrapReverse}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
}
}
通过justifyContent
参数设置在主轴方向的对齐方式。
@Entry
@Component
struct FlexLayout {
build() {
Flex({wrap: FlexWrap.WrapReverse, justifyContent: FlexAlign.SpaceBetween}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
}
}
如果之前看过我的另一篇博客ArkUI线性布局(Row/Column),现在理解主轴对齐方式以及参数就很简单,因为它们是类似的。
Flex
容器组件通过 alignItems
参数设置单行布局中子元素在交叉轴的对齐方式。
@Entry
@Component
struct FlexLayout {
build() {
Flex({alignItems: ItemAlign.Center}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
.height(100)
.backgroundColor(Color.Red)
}
}
@Entry
@Component
struct FlexLayout {
build() {
Flex({alignItems: ItemAlign.Stretch}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
.height(100)
.backgroundColor(Color.Red)
}
}
Flex
容器组件通过 alignContent
参数设置子元素各行在交叉轴剩余空间内的对齐方式,只在多行的 Flex
布局中生效。
@Entry
@Component
struct FlexLayout {
build() {
Flex({wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceBetween}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
.height(200)
.backgroundColor(Color.Red)
}
}
@Entry
@Component
struct FlexLayout {
build() {
Flex({wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceAround}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
.height(200)
.backgroundColor(Color.Red)
}
}
@Entry
@Component
struct FlexLayout {
build() {
Flex({wrap: FlexWrap.Wrap, alignContent: FlexAlign.SpaceEvenly}) {
Button("第一个按钮")
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
.height(200)
.backgroundColor(Color.Red)
}
}
子元素通过 alignSelf
属性设置自身在父容器交叉轴的对齐方式,且会覆盖 Flex
容器组件中 alignItems
属性配置。
alignSelf
属性和alignSelf
属性的取值范围一样。
ps:多行布局中,alignSelf
属性无效。
@Entry
@Component
struct FlexLayout {
build() {
Flex({alignItems: ItemAlign.Center}) {
Button("第一个按钮")
.alignSelf(ItemAlign.Stretch)
Button("第二个按钮")
Button("第三个按钮")
Button("第四个按钮")
}
.height(200)
.backgroundColor(Color.Red)
}
}
在弹性布局Flex尺寸过大或过小,通过子组件flexShrink
和flexGrow
属性进行缩放,达到自适应布局能力。
弹性布局Flex如何判断其尺寸是否过大或过小?
子组件有个flexBasis
属性,用来设置子组件在父容器主轴方向上的基准尺寸。如果设置了该值,则子项占用的空间为设置的值;如果没设置该属性,flexBasis
值为width或height的值。Flex组件就是通过累加所有子组件的flexBasis
属性值,如果大于Flex组件在主轴方向的尺寸,则过大;反之,则过小。
@Entry
@Component
struct FlexLayout {
build() {
Flex() {
Button("第一个按钮")
.flexGrow(1)
Button("第二个按钮")
.flexGrow(2)
}
.height(200)
.backgroundColor(Color.Red)
}
}