Android: measureText () Возвращает пиксели на основе масштабированных пикселей - PullRequest
17 голосов
/ 04 июня 2011

Поэтому я использую метод PaintText () от Paint для измерения ширины сегмента текста, но я хотел измерить текст на основе определенного размера текста. Скажем, я хотел получить ширину текстового сегмента, которая будет составлять 20 масштабированных пикселей, когда он занимает определенный TextView. Я попробовал следующее:

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

Однако, похоже, это не работает. Я считаю, что он возвращает ширину относительно меньшего размера текста. Я чувствую, что мне не хватает чего-то, что заставит меня бить себя по лицу и кричать сумасшедший сумасшедший.

Ответы [ 4 ]

38 голосов
/ 04 июня 2011

Вам нужно получить множитель плотности так:

final float densityMultiplier = getContext().getResources().getDisplayMetrics().density;
final float scaledPx = 20 * densityMultiplier;
paint.setTextSize(scaledPx);
final float size = paint.measureText("sample text");
1 голос
/ 04 июня 2011

Я делаю что-то подобное, когда мне нужно.

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 голосов
/ 30 ноября 2017

Мне не хватает очков репутации, чтобы комментировать ответы, но в связи с комментариями @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;
0 голосов
/ 11 декабря 2014

Попробуйте

Paint.SetLinearText(true)

Это решило проблему для меня.

...