计算SpannableString的宽度

6
我正在运行时构建一个将放入TextView中的文本。 这个文本由不同大小的字体组成。 我必须计算这个文本的像素宽度。 我尝试使用Paint.measureText,但它没有考虑到不同的字体大小。 如何计算真实的宽度?
这是一个例子:
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" 总大小相同。
谢谢。
2个回答

15
你可以使用staticLayout.getLineWidth(line)来计算SpannableString的宽度。例如:
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);
}

结果:

measureTextWidth = 71.0
textWidth = 77.0

粗体文本更宽。


这是测量跨度文本宽度的正确方法。非常有效。 - Sankar V

-1
你可以使用Paint.measureText,但是你需要正确设置它。这是我正在使用的方法:
    // 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


谢谢,但我没有一个String,而是一个SpannableString。我尝试使用您的代码,但结果是一样的:标准文本的宽度。 - vittochan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接