安卓中计算 TextView 的宽高、打点

来源:互联网 发布:淘宝竹筒粽子的竹筒 编辑:程序博客网 时间:2024/06/05 19:32

背景

假如我们有一个 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();

或者:

int ascent = (int) (-textView.getPaint().ascent());



换行

在宽度为 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 中,当要自己画文本时,需要根据文本的长度做不同处理如打点等,这时我们就可以使用该方法计算文本的宽高。

1 0
原创粉丝点击