Android:measureText()基于缩放像素返回像素

17

我使用Paint类的measureText()方法来测量一段文本的宽度,但我希望可以根据特定的文本大小来测量文本的宽度。比如,我想要获得一个文本片段在某个TextView中占用20个缩放像素时的宽度。我尝试了以下方法:

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

然而,它似乎没有起作用。我相信它返回的是一个相对于较小文本大小的宽度。我感觉自己缺少了一些让我扇自己耳光并大喊“herp derp”的东西。

4个回答

38

你需要像这样获取densityMultiplier:

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

非常感谢!我以为setTextSize的参数已经是以缩放像素为单位的了,所以我很困惑自己错在哪里。现在工作正常了。 :-) - Vinay
对我不起作用,我已将TextView设置为20sp,并运行此代码,但大小给出的比预期小。 - Nathan Schwermann
检查您的字体大小首选项:sp 可缩放独立像素 - 这类似于dp单位,但它还根据用户的字体大小偏好进行缩放。建议您在指定字体大小时使用此单位,以便为屏幕密度和用户的偏好进行调整。 - Caspar Harmer
1
你可以尝试检查你的主题或样式设置。可以在另一部手机上尝试此操作。可以在一个专门为此目的建立的全新项目设置中应用上述代码。某些非标准因素导致了此问题,需要你自己找出原因。 - Caspar Harmer
@schwiz 你解决过这个问题吗?我也遇到了类似的问题... 我测量文本,然后尝试相应地设置TextView的宽度,但我必须将mearueText的结果乘以密度。 - AndreasEK

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());
}

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;

-1

尝试一下

Paint.SetLinearText(true)

这对我解决了问题。


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