4

我需要在 TextView 中进行漂亮的文本换行,尤其是对于标题中的文本。

TextView 的文本换行可能如下所示,其中最后一个单词在换行中:

| ========================= |
|          =====            |

我想要的是在线条宽度更均匀的地方换行:

|     ================      |
|      ==============       |

为一种语言添加 '\n' 并在不同的屏幕尺寸上进行测试很容易,但在翻译超过 10 种时则不然。

4

6 回答 6

3

我已经修改了 TextView 并创建了 UniformTextView。在调查了 TextView 的来源后,我决定将 TextView 的宽度最小化,以获得首选的行数。

    <pl.dziobas.uniformtextview.UniformTextView
        android:text="@string/sample_text"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        app:prefLineNumber="2"
        style="@style/sample_style" />

它对我来说令人满意。
统一文本视图示例

来源可在github 上找到

于 2013-11-03T22:52:33.960 回答
1

您可以在字符串资源 xml 中添加 '\n' 以添加换行符,以便您自己管理包装。

另一种方法是动态添加 '\n' 你得到字符串长度除以 2 并在任一方向搜索下一个空格,第一次找到你只需添加 '\n' 那里。一个黑客,但可能工作。

除此之外,Android 中没有太多用于连字符或排版的内容。可能这篇文章会给你一些提示:http ://smarter-than-the-average-pierre.blogspot.co.at/2011/10/bad-android-typography-tale-of-text.html

于 2013-11-03T18:27:19.047 回答
1

Github AutoFittextViewBitBucket AutoScaletextView中有一个开源项目。

您可以根据您的要求进行更改。

我尝试了 AutoScaleTextview 并到达了下面的 OutPut

在此处输入图像描述

希望这会帮助你。

于 2013-11-03T19:38:19.627 回答
1

该算法大致是:

  1. 计算String宽度(有Paint.measureText什么的)
  2. 如果它小于容器 ( TextView) 宽度,则使用它
  3. 否则除以容器的宽度以知道要输入String多少"\n"
  4. 使用一些搜索算法查找最接近宽度的 1/n 的空格字符(measureText如果字体不是等宽字体,则再次使用)
  5. 在该点的子串并重复点 4 为 n-1 (n > 1)

可能需要进行一些调整,例如使用比实际小一些的容器宽度。

于 2013-11-03T20:13:24.033 回答
0

如果您事先知道文本是什么(我的意思是如果它是硬编码的文本),您可以在 dp 中修复 TextView 的宽度,以便正确包裹,否则您也可以使用 android:ems 来修复最大数量一行中的字符数。所以你的 TextView 可以是:

<TextView
   android:layout_height="wrap_content"
   android:layout_width="100dp"
   android:lines="2"/>

或者

  <TextView
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:ems="15"
     android:lines="2" />

我希望这有帮助!

于 2013-11-03T18:34:33.117 回答
0

查看 Android 自己的 autoTextSizing for TextView,在添加 API 26 中添加支持库,支持从 API 14 开始的app:autoSizeTextType="uniform".

玩得开心!

https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html

于 2018-03-15T07:40:22.550 回答