背景
假如我们有一个 TextView 实例:
TextView textView = new TextView(getContext());
textView.setText("i love u...");
textView.setTextColor(getResources().getColor(R.color.colorAccent));
宽度
计算这个 TextView 中文本的宽度:
int textWidth = (int) android.text.Layout.getDesiredWidth(textView.getText(), textView.getPaint());
或者
float textWidth = textView.getPaint().measureText(textView.getText().toString());
该值表示:
- 该值不包含 textView 的 margin 或 padding 值,是裸文本的长度;textView 的文本中不能含有换行符;
- 该值是 textView 的文本放在一行显示时的长度;
- 该长度可能大于屏幕宽度(此时表示实际文本会折行显示,该长度等于折行后的各行文本的长度之和);
高度
Rect bounds = new Rect();
mTextPaint = textView.getPaint();
mText = textView.getText().toString();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
textHeight = bounds.height();
换行
在宽度为 textWidthAtMost 的水平空间,最多可以放下 charNumInThisLine 个字符:
int charNumInThisLine = mTextPaint.breakText(mText, index, len, true, textWidthAtMost, null);
注意,这里换行没有考虑换行策略(分词策略)以及行间距等。
打点
an droid.text.TextUtils 工具类提供了自动打点(省略号)的功能:
CharSequence s = TextUtils.ellipsize(CharSequence mText, TextPaint p, float textWidthAtMost, TruncateAt where);
在宽度为 textWidthAtMost 的水平空间,如果 mText 能放的下就原样返回 mText,否则按照 where (TruncateAt.START,TruncateAt.MIDDLE,TruncateAt.END,TruncateAt.MARQUEE,TruncateAt.END_SMALL)的方式进行打点并返回打点后的字符串。
用途
在自定义 View 中,当要自己画文本时,需要根据文本的长度做不同处理如打点等,这时我们就可以使用该方法计算文本的宽高。