当行宽等于 TextView 的宽度时,为什么 TextView 会断行
Why TextView breaks line when width of line is equal to width of TextView
我有一个 TextView
,它的 textSize
是 3
。我想在其中显示此字符串:
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
中,我可以看到 textAreaWidth
和 lineWidth
的值:
textAreaWidth > 668
lineWidth > 668.0
如你所见textAreaWidth
和lineWidth
是相等的,但是TextView
将line
分成2行并显示他们:
لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف
بهبود
为什么 TextView
在行宽等于文本的可用宽度时中断 line
?
如果你希望它是单行,那么使用 TextView 的最大行数 属性 :
android: maxLines="1"
我将此添加为答案而不是评论,因为它相对 in-depth,但不幸的是,我对您的问题没有准确的答案。
我通常使用两种不同的方法来测量文本:
TextPaint.measureText()
TextPaint.getTextBounds()
根据我的个人经验,第一个可以更好地准确测量文本的宽度,第二个可以更好地为您准确测量文本的高度.
然而,这两种方法都无法完美衡量文本所需的精确大小(即适合文本的最小边界框)和这两种方法都没有给出相同的答案正如 TextView
使用的那样。
我(诚然有限)的理解是 TextView
使用 StaticLayout
和 DynamicLayout
类 来测量文本。在非常简要地研究了那些 类 之后,我没有看到一个明显的方法来回答 "how wide will this text be";相反,他们似乎更擅长回答 "how many lines will this text be, given N pixels of width".
希望这可以帮助您指明正确的方向。
我有一个 TextView
,它的 textSize
是 3
。我想在其中显示此字符串:
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
中,我可以看到 textAreaWidth
和 lineWidth
的值:
textAreaWidth > 668
lineWidth > 668.0
如你所见textAreaWidth
和lineWidth
是相等的,但是TextView
将line
分成2行并显示他们:
لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف
بهبود
为什么 TextView
在行宽等于文本的可用宽度时中断 line
?
如果你希望它是单行,那么使用 TextView 的最大行数 属性 :
android: maxLines="1"
我将此添加为答案而不是评论,因为它相对 in-depth,但不幸的是,我对您的问题没有准确的答案。
我通常使用两种不同的方法来测量文本:
TextPaint.measureText()
TextPaint.getTextBounds()
根据我的个人经验,第一个可以更好地准确测量文本的宽度,第二个可以更好地为您准确测量文本的高度.
然而,这两种方法都无法完美衡量文本所需的精确大小(即适合文本的最小边界框)和这两种方法都没有给出相同的答案正如 TextView
使用的那样。
我(诚然有限)的理解是 TextView
使用 StaticLayout
和 DynamicLayout
类 来测量文本。在非常简要地研究了那些 类 之后,我没有看到一个明显的方法来回答 "how wide will this text be";相反,他们似乎更擅长回答 "how many lines will this text be, given N pixels of width".
希望这可以帮助您指明正确的方向。