如何在 Jetpack Compose 中按基线对齐行元素

How to align row elements by the baseline in Jetpack Compose

如何根据基线对齐 Row 中的元素。我的问题是我想要一个包含多个 Text 元素的 Row 元素,并且每个 Text 元素都将具有不同的字体和大小。默认情况下,它们在顶部对齐。我需要它们在底部对齐。这是代码:

class MainActivity : ComponentActivity()  {
    override fun onCreate(savedInstanceState: Bundle?)  {
        super.onCreate(savedInstanceState)

        setContent {
            MaterialTheme {
                Row {
                    Text(
                        text = "Abrakadabra",
                        style = TextStyle(fontSize = 22.sp, fontWeight = FontWeight.Bold)
                    )
                    Text(
                        text = "Abrakadabra",
                        style = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Bold)
                    )
                }
            }
        }
    }
}

这是代码的呈现视图:

将以下修饰符添加到文本可组合项中,这应该会处理好它。这是供您参考的代码

Text(...,  modifier = LayoutGravity.RelativeToSiblings(alignmentLine = FirstBaseline))
Text(...,  modifier = LayoutGravity.RelativeToSiblings(alignmentLine = FirstBaseline))

截图

更新:这不再有效。请改为检查

目前,使用 Jetpack Compose 1.0.0-alpha03,您可以通过以下方式实现:

Text(modifier = Modifier.alignWithSiblings(FirstBaseline), ...)

在 Jetpack Compose 中 1.0.0 可以这样实现:

Row {
    Text(
        text = "One",
        fontSize = 20.sp,
        modifier = Modifier.alignByBaseline()
    )

    Text(
        text = "Two",
        fontSize = 12.sp,
        modifier = Modifier.alignByBaseline()
    )
}

结果:


如果有人想在使用多行时将文本对齐到最后一个基线 Text 可以使用 Modifier.alignBy(LastBaseline)

来完成
Row {
    Text(
        text = "Line 1\nLine 2",
        fontSize = 20.sp,
        modifier = Modifier.alignBy(LastBaseline)
    )

    Text(
        text = "Line 3",
        fontSize = 12.sp,
        modifier = Modifier.alignBy(LastBaseline)
    )
}

我一点也不为此感到骄傲;我只是在报告。 Whosebug 上列出的答案(使用 Modifier.alignBy(LastBaseline),将 Text() 包装在 Box() 中并使用 Modifier.align(Alignment.BottomStart))对我不起作用。可能是因为我正在使用 onTextLayout 回调。

直到我能找到更简单的方法,这会得到我想要的。

@Composable
fun ForceTextToBottom(){
    val density=LocalDensity.current
    var offset by remember{mutableStateOf(0.dp)}
    var aHeightThatIAlreadyKnowInAdvance=100.dp
    Column{
           //some stuff before the stubborn Text()
        Row{//the parent of the stubborn Text()
            Image{//the sibling of the stubborn Text()
            Text(sentence, //This is the stubborn Text()
                ...
                ...
                modifier=Modifier
                    .height(aHeightThatIAlreadyKnowInAdvance)
                    .offset(y=offset)
                ...
                ...
                onTextLayout={textLayoutResult->
                    //Some layout size correction logic
                    offset=with(density){100.dp-textLayoutResult.getLineBottom(textLayoutResult.lineCount-1).toDp()}
                    }
                )
            }               
        }
    }
}

没有什么让我高兴的。但它使文本与底部对齐。

你好这是最佳答案

Row(verticalAlignment = Alignment.Bottom ) {
    Text(
        text = "One",
        fontSize = 20.sp,
     
    )

    Text(
        text = "Two",
        fontSize = 12.sp,
      
    )
}

通过在一行中使用 verticalAlignment 和 horizo​​ntalArrangement 或在一列中使用 horizo​​ntalAlignment 和 verticalArrangement,您可以轻松控制位置,并且有很多选项需要查看,以 Row 为例,您可以使用 verticalAlignment = Alignment.BottomverticalAlignment = Alignment.TopverticalAlignment = Alignment.Center