gpt4 book ai didi

android - 如何在Android中将文本放入具有固定宽度和高度的StaticLayout?

转载 作者:行者123 更新时间:2023-12-03 13:28:00 26 4
gpt4 key购买 nike

我正在尝试使用 Canvas 绘制文本并发现使用 StaticLayout会自动处理换行符。我还想限制它的高度,以便当文本太长时它会被椭圆化,但文本容器的大小是动态的。我可以轻松地将宽度应用于 StaticLayout ,但找不到做高度的方法。
我尝试使用 TextUtils.ellipsize() ,但在获取行间距时遇到问题。

最佳答案

PerracoLabs 有正确的答案,但正如 CheokYanCheng 所说,最大行数的计算是关闭的(尽管它可能会产生正确的结果,即使不是大多数时候)。
不能为 StaticLayout 指定最大高度,除非通过指定最大行数间接指定。省略号无论如何都与最大行数相关,因此确定特定高度的最大行数以返回解决方案是要走的路。那么,我们如何确定适当的最大行数,以便可以创建带有省略号的固定大小的静态布局,正如 PerracoLabs 解释的那样。
如果文本没有影响任何文本行高度的跨度,则简单的计算可​​以确定在省略号之前适合静态布局的最大行数。
以下 Kotlin 函数将确定多少行文本将适合具有固定高度和宽度的 View 。假设 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
}
但是,如果文本包含更改一行或多行高度的跨度,则计算最大行数的唯一方法是创建包含整个文本(无省略号)的静态布局,然后检查布局中的线条来确定有多少完整的线条适合。然后可以使用从检查中确定的计算出的最大行数创建一个新的 StaticLayout。
以下 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
}
我已经发布了 small project在 GitHub 上作为演示。
这是该应用程序的屏幕截图。
enter image description here

关于android - 如何在Android中将文本放入具有固定宽度和高度的StaticLayout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com