如何在Android中以固定宽度和高度将文本放入StaticLayout中?

use*_*027 8 android staticlayout

我正在尝试使用绘制文本Canvas并发现使用StaticLayout会自动处理换行符。我还想限制它的高度,以便当文本太长时它会被椭圆化,但文本容器的大小是动态的。我可以轻松地将宽度应用于StaticLayout,但无法找到设置高度的方法。

我尝试使用TextUtils.ellipsize(),但在获取行之间的间距时遇到问题。

Che*_*amp 1

PerracoLabs 有正确的答案,但正如 CheokYanCheng 所说,最大行数的计算是关闭的(尽管它可能会在很多时候(如果不是大多数情况下)产生正确的结果)。

除非通过指定最大行数间接指定,否则无法为StaticLayout指定最大高度。无论如何,省略号与最大行数相关,因此确定特定高度的最大行数以返回到解决方案是可行的方法。那么,我们如何确定适当的最大行数,以便可以创建带有省略号的固定大小的 StaticLayout,如 PerracoLabs 所解释的那样。

如果文本没有影响任何文本行高度的跨度,则只需计算即可确定省略号之前适合 StaticLayout 的最大行

以下 Kotlin 函数将确定有多少行文本适合具有固定高度和宽度的视图。假设StaticLayout的每一行都有一个设定的高度(没有影响高度的跨度)。顶行与其他行具有相同的高度,但通过顶部填充进行了增强。底线添加了底部填充。

private fun getMaxLines(maxHeight: Int): Int {  
    // Build a dummy StaticLayout to get the internal measurements.  
    return makeStaticLayout("", width, 1).run {  
        val lineHeight = getLineBottom(0) - getLineTop(0) + topPadding - bottomPadding  
        (maxHeight - topPadding - bottomPadding) / lineHeight  
}  
Run Code Online (Sandbox Code Playgroud)

但是,如果文本包含更改一行或多行高度的跨度,则计算最大行数的唯一方法是创建包含整个文本(无省略号)的静态布局,然后检查布局中的线条来确定有多少条完整的线条适合。然后可以使用通过检查确定的计算出的最大行数创建新的静态布局。

以下 Kotlin 函数将通过检查StaticLayout中存在的最后一个整行来计算最大行数。

private fun getMaxLinesByInspection(staticLayout: StaticLayout, maxHeight: Int): Int {
    var line = staticLayout.lineCount - 1
    while (line >= 0 && staticLayout.getLineBottom(line) >= maxHeight) {
        line--
    }
    return line + 1
}
Run Code Online (Sandbox Code Playgroud)

我在 GitHub 上发布了一个小项目作为演示。

这是该应用程序的屏幕截图。

在此输入图像描述