当行宽等于 TextView 的宽度时,为什么 TextView 会断行

Why TextView breaks line when width of line is equal to width of TextView

我有一个 TextView,它的 textSize3。我想在其中显示此字符串:

String line = 
لورم  ایپسوم  متن  ساختگی  با  تولید  سادگی  نامفهوم  از  صنعت  چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف بهبود;

我通过实现 ViewTreeObserver.OnGlobalLayoutListener 接口在 运行 时计算文本的 TextView 可用宽度:

int textAreaWidth;
@Override
public void onGlobalLayout() {
    textAreaWidth = textView.getWidth() - (textView.getPaddingLeft() + textView.getPaddingRight());
}

我也这样计算 line 的宽度:

TextPaint textPaint = textView.getPaint();
float lineWidth = textPaint.measureText(line);

Logcat 中,我可以看到 textAreaWidthlineWidth 的值:

textAreaWidth > 668
lineWidth > 668.0

如你所见textAreaWidthlineWidth是相等的,但是TextViewline分成2行并显示他们:

لورم  ایپسوم  متن  ساختگی  با  تولید  سادگی  نامفهوم  از  صنعت  چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف 
بهبود

为什么 TextView 在行宽等于文本的可用宽度时中断 line

如果你希望它是单行,那么使用 TextView 的最大行数 属性 :

android: maxLines="1"

我将此添加为答案而不是评论,因为它相对 in-depth,但不幸的是,我对您的问题没有准确的答案。

我通常使用两种不同的方法来测量文本:

  • TextPaint.measureText()
  • TextPaint.getTextBounds()

根据我的个人经验,第一个可以更好地准确测量文本的宽度,第二个可以更好地为您准确测量文本的高度.

然而,这两种方法都无法完美衡量文本所需的精确大小(即适合文本的最小边界框)这两种方法都没有给出相同的答案正如 TextView 使用的那样。

我(诚然有限)的理解是 TextView 使用 StaticLayoutDynamicLayout 类 来测量文本。在非常简要地研究了那些 类 之后,我没有看到一个明显的方法来回答 "how wide will this text be";相反,他们似乎更擅长回答 "how many lines will this text be, given N pixels of width".

希望这可以帮助您指明正确的方向。