TextView(和 EditText)打破文本的方式是通过内部对 BoringLayout 的私有函数调用。因此,最好的方法是子类化 EditText 并重写这些函数。但这不会是一项微不足道的任务。
因此,在TextView 类中创建了不同的文本样式类。我们看的是DynamicLayout。在这个类中,我们到达了类StaticLayout的引用(在一个名为 reflowed 的变量中)。在此类的构造函数中,您将找到文本换行算法:
/*
* From the Unicode Line Breaking Algorithm:
* (at least approximately)
*
* .,:; are class IS: breakpoints
* except when adjacent to digits
* / is class SY: a breakpoint
* except when followed by a digit.
* - is class HY: a breakpoint
* except when followed by a digit.
*
* Ideographs are class ID: breakpoints when adjacent,
* except for NS (non-starters), which can be broken
* after but not before.
*/
if (c == ' ' || c == '\t' ||
((c == '.' || c == ',' || c == ':' || c == ';') &&
(j - 1 < here || !Character.isDigit(chs[j - 1 - start])) &&
(j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
((c == '/' || c == '-') &&
(j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
(c >= FIRST_CJK && isIdeographic(c, true) &&
j + 1 < next && isIdeographic(chs[j + 1 - start], false))) {
okwidth = w;
ok = j + 1;
这是所有包装的地方。因此,您需要对 StaticLayout、DynamicLayout、TextView 和最后的 EditText 进行子类化处理,我敢肯定,这将是一场噩梦 :( 我什至不确定所有流程是如何进行的。如果您愿意,请先查看 TextView并检查 getLinesCount 调用 - 这将是起点。