首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算SpannableString witdh

计算SpannableString witdh
EN

Stack Overflow用户
提问于 2010-11-22 21:23:06
回答 2查看 4.1K关注 0票数 6

我正在运行时构建一个文本,它将被放入TextView中。此文本已使用不同大小的字体排版。我必须计算这个文本的宽度,单位是像素。我试过使用Paint.measureText,但它没有考虑不同的字体大小。如何计算实际宽度?

这是一个示例:

代码语言:javascript
复制
LinearLayout text = (LinearLayout) findViewById(R.id.LinearLayout);

SpannableStringBuilder str = new SpannableStringBuilder("0123456789");
str.setSpan(new RelativeSizeSpan(2f), 3, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

TextView tmp = new TextView(this);
tmp.setText(str,BufferType.SPANNABLE);
text.addView(tmp);

Float dim = tmp.getPaint().measureText(str, 0, str.length());

在本例中,如果我将相对大小设置为"2f“或”3f“(例如),则返回"MeasureText”的总大小是相同的。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-05-16 15:23:24

您可以使用staticLayout.getLineWidth(line)来计算SpannableString的宽度。例如:

代码语言:javascript
复制
CharSequence boldText = Html.fromHtml("<b>ABCDEFG</b>HIJK");
TextPaint paint = new TextPaint();

float measureTextWidth = paint.measureText(boldText, 0 , boldText.length());

StaticLayout tempLayout = new StaticLayout(boldText, paint, 10000, android.text.Layout.Alignment.ALIGN_NORMAL, 1f, 0f, false);
int lineCount = tempLayout.getLineCount();
float textWidth =0;
for(int i=0 ; i < lineCount ; i++){
    textWidth += tempLayout.getLineWidth(i);
}

结果:

代码语言:javascript
复制
measureTextWidth = 71.0
textWidth = 77.0

BoldText的范围更广。

票数 13
EN

Stack Overflow用户

发布于 2010-11-22 22:22:41

您可以使用Paint.measureText,但您需要正确设置它。下面是我使用的代码:

代码语言:javascript
复制
    // init helper
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setStrokeWidth(1);
    mPaint.setStrokeCap(Paint.Cap.ROUND);

    // Measure
    mPaint.setTextSize(mTextField1.getTextSize());
    mPaint.setTypeface(mTextField1.getTypeface());
    mText1TextWidth = mPaint.measureText(mTextField1.getText().toString());

BR

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4245809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档