Android: measureText () Обратные пиксели на основе масштабированных пикселей

17

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

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

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

    
задан Vinay 03.06.2011 в 22:50
источник

4 ответа

38

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

final float densityMultiplier = getContext().getResources().getDisplayMetrics().density;
final float scaledPx = 20 * densityMultiplier;
paint.setTextSize(scaledPx);
final float size = paint.measureText("sample text");
    
ответ дан Caspar Harmer 04.06.2011 в 00:10
источник
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());
}
    
ответ дан madmik3 03.06.2011 в 23:15
источник
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;
    
ответ дан Groove 30.11.2017 в 07:12
источник
-1

Попробуйте

Paint.SetLinearText(true)

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

    
ответ дан Alex 11.12.2014 в 13:45
источник