查找 Android Jetpack 撰写文本的一行中可以容纳的最大字符

问题描述 投票:0回答:2

我想找到当前 Jetpack 撰写的一行中可以容纳的字符总数文本

我可以获得此信息的任何领域。谢谢

android kotlin string-length android-jetpack-compose-text
2个回答
0
投票

可以在打印之前计算文本宽度,请参阅[1][2]

Column {

    var size by remember { mutableStateOf(IntSize.Zero) }
    val textMeasurer = rememberTextMeasurer()
    val longText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."
    val shortText = getShortenedText(longText, textMeasurer, size.width)

    Text(
        modifier = Modifier
            .fillMaxWidth()
            .onSizeChanged { size = it },
        text = shortText,
        maxLines = 1,
        style = yourStyle,
    )

在这种情况下,我们可以根据需要多次测量缩减文本,直到得到适合

Text
的字符串。首先,我们将测量
longText
的全长。如果它适合
Text
,我们将打印它。如果不合适,我们将减少文字并重新测量。您可以根据需要使用二分搜索或按比例除法。

@Composable
private fun getShortenedText(
    longText: String,
    textMeasurer: TextMeasurer,
    maxWidth: Int,
): String {
    var start = 0
    var end = longText.length
    var text = longText.substring(0, end)
    var width = textMeasurer.measure(text, yourStyle).size.width
    if (width <= maxWidth) return text
    while (start < end - 1) {
        val newBorder = start + (end - start) / 2
        text = longText.substring(0, newBorder)
        width = textMeasurer.measure(text, yourStyle).size.width
        if (width <= maxWidth) {
            start = newBorder
        } else {
            end = newBorder
        }
    }
    return longText.substring(0, start)
}

-3
投票

您可能认为

Text()
可组合项是一些具有固定尺寸的占位符(框)

然后你在其中放置一些文本

并询问我们,您可以使用多少个字符来容纳此占位符。

但事情却相反:

  1. 其中没有
    Text()
    可组合 without 文本字符串。
  2. Text()
    可组合项占据尽可能多的空间。

因此,例如,它占据整个屏幕,如果没有其他元素,尽管文本仅包含 1 个字符。

所以你现在的问题没有任何意义。

您可能想解决一件事,但向我们询问另一件事 – 请参阅什么是 X-Y 问题? 并可能编辑您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.