开发者

Android: measureText() Return Pixels Based on Scaled Pixels

开发者 https://www.devze.com 2023-03-10 02:28 出处:网络
So I use Paint\'s measureText() method to measure the width of a segment of text, but I wanted to measure text based on a certain text size. Say I wanted to get the width of a text segment that will b

So I use Paint's measureText() method to measure the width of a segment of text, but I wanted to measure text based on a certain text size. Say I wanted to get the width of a text segment that will be 20 scaled pixels when it occupies a certain TextView. I tried the following:

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

However, it does not seem to be working. I believe it is returning a width with respect to a smaller text size. I feel like I'm missing something that will make me slap myself in the face an开发者_如何转开发d yell herp derp.


You need to get the densityMultiplier like so:

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


I do something like this when I have to.

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


I don't have enough reputation points to comment on answers but in reference to the comments by @schwiz and @AndreasEK on the accepted answer:

measureText(), along with getTextBounds(), does not include padding so it's possible that the solution to their problem is to add the left and right padding (or start and end padding)

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;


Try

Paint.SetLinearText(true)

That solved the problem for me.

0

精彩评论

暂无评论...
验证码 换一张
取 消