Column Row Box

zujjp
Compose 的布局控件 Column、Row、Box

Column

Column 将多个项水平地放置在屏幕上;类似垂直的 LinearLayout

属性

@Composable
inline fun Column(
    modifier: Modifier = Modifier,
    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
    horizontalAlignment: Alignment.Horizontal = Alignment.Start,
    content: @Composable ColumnScope.() -> Unit
)

Column 内组件对齐方式

Column 垂直方向使用 Arrangement 设置,水平方向使用 Alignment 设置。

verticalArrangement 垂直方向对齐方式

verticalArrangement 参数可以设置 Column 垂直排列的方式:

Column(
    modifier = Modifier.fillMaxHeight().fillMaxWidth(),
    verticalArrangement = Arrangement.Center
) {
    Text(text = "千里之行")
    Text(text = "始于足下")
}

Arrangement 的值和对应效果如下:

kuusl

horizontalAlignment Column 内组件水平对齐

horizontalAlignment 参数可以设置 Column 的水平对齐方式,horizontalAlignment 的值有三种:

Column(
    modifier = Modifier.fillMaxHeight().fillMaxWidth(),
    verticalArrangement = Arrangement.Center, // 设置垂直居中对齐
    horizontalAlignment =  Alignment.CenterHorizontally // 设置水平居中对齐
) {
    Text(text = "千里之行")
    Text(text = "始于足下")
}

将 Column 里面的内容将垂直水平都居中

设置尺寸

// 设置了Column的大小为 200dp * 200dp
Column(
    modifier = Modifier
        .height(200.dp)
        .width(200.dp)
) {
    Text(text = "千里之行")
    Text(text = "始于足下")
}
// 使用Modifier.size(width,height)来设置Column的大小
Column(
    modifier = Modifier.size(300.dp, 200.dp)
) {
    Text(text = "千里之行")
    Text(text = "始于足下")
}
// 使用Modifier.fillMaxHeight().fillMaxWidth()来设置Column的大小,
// 此时Column将填充父控件的剩余大小,类似于match_parent 。可以直接使用Modifier.fillMaxSize()来直接设置
Column(
    modifier = Modifier
        .fillMaxHeight()
        .fillMaxWidth()
) {
    Text(text = "千里之行")
    Text(text = "始于足下")
}

内容高度按比例分配 weight

设置 Weight 属性需要在 Column / Row 的子 View 中调用,使用 Modifie.weight()(与 LinearLayout 子 View 设置 weight 类似)

@Stable
fun Modifier.weight(
    weight: Float,
    fill: Boolean = true
): Modifier

在 LazyColumn 里 weight 会失效?

Column(
    modifier = Modifier.fillMaxSize()
) {
    Text(text = "千里之行",Modifier.weight(1f))
    Text(text = "始于足下",Modifier.weight(1f))
}

Column / Row 添加滚动

添加滚动需要设置 Column / Row 的 Modifier.verticalScroll / Modifier.horizontalScroll

fun Modifier.verticalScroll(
    state: ScrollState,
    enabled: Boolean = true,
    flingBehavior: FlingBehavior? = null,
    reverseScrolling: Boolean = false
)

示例:

@Composable
fun ColumnScrollView() {
    val scrollLocation = rememberScrollState(0) //设置初始滑动位置
    Log.i("hacket", "====Column Scroll==== Location:${scrollLocation.value}")
    Column(
        modifier = Modifier
            .height(200.dp)
            .fillMaxWidth()
            .background(Color.White)
            .verticalScroll(scrollLocation)
    ) {
        for (i in 0..20) {
            Text(
                text = "竖向排列 $i",
                modifier = Modifier.height(50.dp)
            )
        }
    }
}

Row

Row 将多个项水平地放置在屏幕上;类似水平的 LinearLayout

Row 属性介绍

inline fun Row(
    modifier: Modifier = Modifier,
    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
    verticalAlignment: Alignment.Vertical = Alignment.Top,
    content: @Composable RowScope.() -> Unit
)

Row 水平方向使用 Arrangement 设置,垂直方向使用 Alignment 设置。

其他基本同 Column

Box

Box 将一个元素放在另外一个元素上;类似 FrameLayout。

Box 属性介绍

@Composable
inline fun Box(
    modifier: Modifier = Modifier,
    contentAlignment: Alignment = Alignment.TopStart,
    propagateMinConstraints: Boolean = false,
    content: @Composable BoxScope.() -> Unit
) {
    val measurePolicy = rememberBoxMeasurePolicy(contentAlignment, propagateMinConstraints)
    Layout(
        content = { BoxScopeInstance.content() },
        measurePolicy = measurePolicy,
        modifier = modifier
    )
}

示例:

@Composable
fun BoxView() {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.White),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "Text 1",
            modifier = Modifier
                .size(300.dp)
                .background(Color.Blue)
        )
        Text(
            text = "Text 2",
            modifier = Modifier
                .size(200.dp)
                .background(Color.Red)
        )
        Text(
            text = "Text 3",
            modifier = Modifier
                .size(100.dp)
                .background(Color.DarkGray)
        )
    }
}

6js26

Box 子 View 方向设定 contentAlignment

Box 方向设定使用 Alignment 设定

BoxWithConstraints

子 View 可在 BoxWithConstraints 控件内获取到约束属性

@Composable
fun BoxWithConstraintsView() {
    BoxWithConstraints(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.White)
    ) {
        this.constraints
        this.maxHeight
        this.minHeight
        this.maxWidth
        this.minWidth

        Text(
            text = "Text 1",
            Modifier
                .width(this.minWidth)
                .height(this.minHeight)
        )
    }
}