2011-06-03 61 views
17

因此,我使用Paint的measureText()方法来测量一段文本的宽度,但我想根据某个文本大小来测量文本。假设我想获得一个文本段的宽度,当它占据某个TextView时,这个段的宽度将为20个缩放像素。我试过以下内容:Android:measureText()基于比例像素的返回像素

Paint paint = new Paint(); 
paint.setTextSize(20); 
paint.measureText("sample text"); 

但是,它似乎并没有工作。我相信它正在返回一个较小的文字大小的宽度。我感觉自己失去了一些能让我拍拍自己的东西,并大声嚷嚷着her de。

回答

38

你需要得到densityMultiplier像这样:

final float densityMultiplier = getContext().getResources().getDisplayMetrics().density; 
final float scaledPx = 20 * densityMultiplier; 
paint.setTextSize(scaledPx); 
final float size = paint.measureText("sample text"); 
+0

非常感谢!我的印象是setTextSize的参数已经是缩放像素了,所以我对我出错的地方感到困惑。现在工作正常。 :-) – Vinay 2011-06-03 22:55:40

+0

不适用于我,我将textview设置为20sp并运行此代码,尺寸给我的东西比预期的要小 – schwiz 2011-10-04 03:48:01

+0

检查字体大小首选项:sp 与比例无关的像素 - 这与dp单元类似,但它也会根据用户的字体大小偏好进行缩放。建议您在指定字体大小时使用本机,以便针对屏幕密度和用户偏好进行调整。 – 2011-10-04 04:08:21

1

当我必须的时候,我会这样做。

int textSize = 20; 
for(int i = 2; i<18 && curTextSize< textSize;i+=2) 
{ 
    this.label.setTextSize(i); 
    curTextSize = this.label.getPaint().measureText(this.label.getText().toString()); 
} 
-1

尝试

Paint.SetLinearText(true) 

这解决了这个问题对我来说。

0

我没有足够的声望点数上的答案,但在参考上公认的答案的评论通过@schwiz和@AndreasEK评论:

measureText(),与getTextBounds()一起,不包括填充因此它可能该解决他们的问题是增加的左右填充(或开始和结束填充)

final float scaleFactor = getContext().getResources().getDisplayMetrics().density; 
final float scaledPx = 20 * scaleFactor; 
paint.setTextSize(scaledPx); 
final float padding = scaleFactor * (textView.getPaddingStart() + textView.getPaddingEnd()); 
final float size = paint.measureText("sample text") + padding;