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

Android:measureText()返回基于缩放像素的像素,android,paint,text-size,Android,Paint,Text Size,因此,我使用Paint的measureText()方法来测量文本段的宽度,但我希望根据特定的文本大小来测量文本。假设我想得到一个文本段的宽度,当它占据一个特定的文本视图时,它将是20个缩放像素。我尝试了以下方法: Paint paint = new Paint(); paint.setTextSize(20); paint.measureText("sample text"); 然而,它似乎不起作用。我相信它返回的是相对于较小文本大小的宽度。我觉得我错过了一些东西,这些东西会让我打自己一巴掌,

因此,我使用Paint的measureText()方法来测量文本段的宽度,但我希望根据特定的文本大小来测量文本。假设我想得到一个文本段的宽度,当它占据一个特定的文本视图时,它将是20个缩放像素。我尝试了以下方法:

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

然而,它似乎不起作用。我相信它返回的是相对于较小文本大小的宽度。我觉得我错过了一些东西,这些东西会让我打自己一巴掌,然后大喊herp derp。

我会在必要的时候这样做

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());
}
int textSize=20;

对于(int i=2;i你需要这样得到密度倍增管:

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


这就解决了我的问题。

我没有足够的声誉点数来评论答案,但关于@schwiz和@AndreasEK对公认答案的评论:

measureText()
,以及
getTextBounds()
,不包括填充,因此解决问题的方法可能是添加左右填充(或开始和结束填充)


非常感谢!我觉得SettexSize的参数已经是按比例像素了,所以我不知道哪里出了问题。现在可以正常工作了。:-)不适合我,我将textview设置为20sp,运行此代码时,大小会比预期的小检查字体大小首选项:sp缩放独立像素-这类似于dp单元,但它也会根据用户的字体大小首选项进行缩放。建议您在指定字体大小时使用此单位,以便根据屏幕密度和用户偏好进行调整。您可以尝试检查主题或样式设置。试着在另一部手机上这样做。试着在一个新的项目设置中应用上面的代码。一些非标准的东西导致了这一点,这取决于你去解决它。@schwiz你有没有解决过这个问题?我面临着一个类似的问题。。。我测量文本,然后尝试相应地设置文本视图的宽度,但我必须将mearueText的结果乘以密度。
Paint.SetLinearText(true)
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;