【问题标题】:How to fit text into StaticLayout with fixed width and height in Android?如何在Android中将文本放入具有固定宽度和高度的StaticLayout?
【发布时间】:2018-07-13 08:12:02
【问题描述】:

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

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

【问题讨论】:

    标签: android staticlayout


    【解决方案1】:

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

    不能为 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  
    }  
    

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

    我在 GitHub 上发布了一个small project 作为演示。

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

    【讨论】:

      【解决方案2】:

      您(和@Cheok Yan Cheng)可能会尝试使用PagedTextView。该视图适用于Paginating text in Android

      视图部分解决了问题,即对动态大小变化做出反应。至于文本省略,您可以通过自定义我用来测量文本高度的algorithm 来实现这一点。

      【讨论】:

      • @Cheok Yan Cheng,您需要算法定制方面的帮助吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多