我正在研究每个修改者的整个记录. 现在我在理解作文修饰语时遇到了一些问题. 它是.alignBy修饰符. 与方框和文本的对齐方式清晰.文本按其基线对齐. 我可以看到文本的基线在哪里. 洋红色框的中间位置与红色文本的基线位置相同. 如果框更靠近行的顶部,则文本向下滑动.

@Preview(heightDp = 200, backgroundColor = 0xFFCCCCCC, showBackground = true)
@Composable
fun test1() {
    Row(Modifier.fillMaxHeight()) {
        Box(
            modifier = Modifier.size(80.dp, 40.dp)
                .alignBy { it.measuredHeight / 2 }
                .background(Color.Magenta)
        )
        Text(
            text = "Text 1",
            fontSize = 40.sp,
            modifier = Modifier.alignByBaseline().background(color = Color.Red)
        )
        Text(
            text = "Text 2",
            modifier = Modifier.alignByBaseline().background(color = Color.Cyan)
        )
    }
}

现在我试着把两个盒子排成一排,现在我不明白怎么对齐了.长方体的基线似乎在它的中间.我需要两次"alignby{}"吗?我找不到好的解释,也找不到能解释我问题的教程.在我看来,Android开发人员的文档和示例没有多大帮助.

@Preview(heightDp = 200, backgroundColor = 0xFFCCCCCC, showBackground = true)
@Composable
fun test2() {
    Row(Modifier.fillMaxHeight()) {
        Box(
            modifier = Modifier.size(80.dp, 40.dp)
                .alignBy { it.measuredHeight / 1 }
                .background(Color.Magenta)
        )
        Box(
            modifier = Modifier.size(80.dp, 20.dp)
                .alignBy { it.measuredHeight / 2 }
                .background(Color.Green)
        )
    }
}

谢谢!

推荐答案

从文档中:

Row内,具有alignBy的所有组件将使用指定的HorizontalAlignmentLines或从alignmentLineBlock获得的值垂直对齐,形成一个同级组.

在您的第二个示例中:

洋红色Box被放置在行的顶部,因为它在Row中有Alignment.Top对齐.然后,绿色Box(it.measuredHeight / 2)的中心与洋红色Box(it.measuredHeight / 1)的末端垂直对齐

enter image description here

使用:

    Box(
        modifier = Modifier.size(80.dp, 40.dp)
            .alignBy { it.measuredHeight / 3 }
            .background(Color.Magenta)
    )
    Box(
        modifier = Modifier.size(80.dp, 20.dp)
            .alignBy { it.measuredHeight / 2 }
            .background(Color.Green)
    )

则洋红色Box(it.measuredHeight / 3)的1/3与绿色Box(it.measuredHeight / 2)的中间垂直对齐

enter image description here

请注意,对于我们想要参加的所有 children ,alignBy()alignByBaseline() has to be specified.

Row(Modifier.fillMaxHeight()) {
    Box(
        modifier = Modifier.size(80.dp, 40.dp)
            .alignBy { it.measuredHeight / 1 }
            .background(Color.Magenta)
    )
    Box(
        modifier = Modifier.size(80.dp, 20.dp)
            .alignBy { it.measuredHeight / 2 }
            .background(Color.Green)
    )
    Box(
        modifier = Modifier.size(20.dp, 20.dp)
            .background(Color.Blue)
    )
}

在本例中,蓝色Box不在同级组中,并且它在Row的顶部对齐,因为它有Alignment.Top.

enter image description here

Android相关问答推荐

如何禁用Android 34+版的TileService,但保留以前的版本?

如何在Jetpack Compose中使用Box Composable来实现这种布局?

strings.xml中字符串数组中的占位符

在一列中垂直对齐两个框

如何在使用 PointerInput 修改器时添加点击时的波纹效果

返回并再次打开webview时webview无法打开相机

SDK 33 的问题 - 面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

为什么我在 android 中使用 TabLayout 时无法启动我的 Activity?

Jetpack Compose 中的用户在线指示器

Compose 状态不是 recomposing

Koin Android-KMM:我有嵌套范围但注入不起作用

每次在 Jetpack Compose 中调用导航

我该怎么做文本计时器

我该怎么做文本计时器

Jetpack 将 Grid 与基于大小的自适应列数组合在一起

根据 Jetpack Compose 中的生命周期正确处理变量/函数

在 Google Play 中将用户从开放测试转移到生产的过程是怎样的?

Jetpack Compose:SpanStyle 的 TextAlign(垂直居中)

为什么我不能直接记住 mutableStateOf 可组合函数?

Android 应用程序在启动时自动启动