设置容器行为

如需配置 FlexBox 容器的行为,请创建一个 FlexBoxConfig 块,并使用 config 参数提供该块。

FlexBox(
    config = {
        direction(FlexDirection.Column)
        wrap(FlexWrap.Wrap)
        alignItems(FlexAlignItems.Center)
        alignContent(FlexAlignContent.SpaceAround)
        justifyContent(FlexJustifyContent.Center)
        gap(16.dp)
    }
) { // child items
}

使用 FlexBoxConfig 定义布局方向、换行行为、对齐方式以及项之间的间距。

布局方向

direction 函数用于设置主轴,主轴决定了内容的布局方向。它接受以下值:

  • Row(默认):将主轴设置为水平。在从左到右的语言区域中,此方向为从左到右,在从右到左的语言区域中,此方向为从右到左。
  • RowReverse:反转 Row 的方向。
  • Column:将主轴设置为垂直方向,从上到下。
  • ColumnReverse:反转 Column 的方向。

对齐内容并分配额外空间

以下部分介绍了如何沿主轴和交叉轴对齐项并分配额外空间。

沿主轴

使用 justifyContent 沿主轴分布内容。下表显示了方向为 Row 时的行为。

水平主轴的插图。

Start

内容与主轴的起始位置对齐。

Center

内容与主轴中心对齐。

End

内容与主轴末端对齐。

SpaceBetween

内容沿主轴分布,且内容之间有间距。

SpaceAround

内容沿主轴分布,周围留有空间。

SpaceEvenly

内容沿主轴分布,周围均匀留出空间。

沿交叉轴

使用 alignItems 可沿交叉轴在单行内对齐各项内容。各个项可以使用 alignSelf 修饰符替换此行为。

下图展示了方向为 Row 时的行为:

垂直交叉轴的插图。 内容与交叉轴的起始位置对齐。 内容与交叉轴的末端对齐。 内容与交叉轴的中心对齐。 内容会拉伸以填满交叉轴。 内容沿交叉轴与其基准对齐。

Start

End

Center

Stretch

Baseline

使用 alignContent 可将行与交叉轴对齐,并在行之间分配额外空间。此属性仅在有多行(启用换行)时适用。下图展示了方向为 Row 时的行为:

垂直交叉轴的插图。 多行内容与交叉轴的起始位置对齐。 多行内容与交叉轴的末尾对齐。 多行内容与交叉轴的中心对齐。 多行内容会拉伸以填充交叉轴。 多行内容沿交叉轴分布,行与行之间有间距。 多行内容沿交叉轴分布,且周围有空间。

Start

End

Center

Stretch

SpaceBetween

SpaceAround

封装内容

换行可让 FlexBox 容器变为多行,将不适合当前行或列的内容沿交叉轴移至新行或新列。使用 wrap 配置换行行为。

FlexWrap 值

使用方向 Row 的示例

NoWrap(默认):防止内容换行。如果主轴尺寸不足,内容会溢出。

由于停用了换行功能,单行中的内容超出了容器范围。

Wrap:当某个项(加上任何间距)没有足够的空间时,系统会在交叉轴方向上创建新行。例如,如果方向为 Row,则会在下方添加新行。

由于启用了换行,内容会换行显示在下方。

WrapReverse:与 Wrap 相同,但新行会沿与交叉轴相反的方向添加。例如,如果方向为 Row,则会在上方添加新行。

由于启用了反向换行,内容项会换行到上方的新行。

以下示例展示了 FlexBox 封装算法的工作原理。FlexBox 容器的主轴尺寸为 100dp,wrap 设置为 FlexWrap.Wrap,间距为 8dp。它包含三个项,basis 分别为 20dp、40dp 和 50dp。

该行有 100dp 个可用空间。Child 1 为 20dp。 有空间,因此子项 1 被放入该行。

放置在 FlexBox 容器中的第一项内容。
图 1. 放置在 FlexBox 容器中的第一项。

该行有 80dp 个可用空间。差距为 8dp。孩子 2 为40dp。所需空间为 48dp。由于有空间,因此间隙和子项 2 会放入该行。

放置在 FlexBox 容器中的第二项内容,位于第一项内容之后。
图 2. FlexBox 容器中放置在第一项后面的第二项。

该行有 32dp 个可用空间。差距为 8dp。子级 3 为 50dp。所需空间为 58dp。当前行中没有足够的空间,因此子级 3 放置在新行中。

第三项因无法容纳在第一行中而放置在新行中。
图 3. 第三项放在新行中,因为它不适合放在第一行。

在内容之间添加间距

使用 rowGap 和 columnGap 在行和列之间添加间隙。这有助于避免向子项添加间距修饰符。

行间距会在项之间添加垂直空间。 列间距会在内容之间添加水平间距。 Gap 会在项之间添加水平和垂直间距。

rowGap

在项和行之间添加垂直间距。

columnGap

在项和行之间添加水平间距。

gap 是一个便捷函数,可同时添加 columnGap 和 rowGap。