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
источник
  • Большое спасибо! У меня создалось впечатление, что параметр setTextSize уже был в масштабированных пикселях, поэтому я был смущен тем, где я ошибся. Сейчас работает отлично. :-) –  Vinay 04.06.2011 в 00:55
  • не работает для меня, у меня есть textview, установленный на 20sp и запускающий этот код, размер дает мне что-то меньшее, чем ожидалось –  schwiz 04.10.2011 в 05:48
  • Проверьте свой размер шрифта: sp Масштабируемые пиксели - это похоже на блок dp, но он также масштабируется по предпочтению размера шрифта пользователя. Рекомендуется использовать этот аппарат при задании размеров шрифта, поэтому они будут настроены как на плотность экрана, так и на предпочтения пользователя. –  Caspar Harmer 04.10.2011 в 06:08
  • Да вроде я сказал 20sp –  schwiz 15.10.2011 в 00:26
  • Вы можете попробовать проверить настройки темы или стиля. Попробуйте сделать это на другом телефоне. Попробуйте применить вышеприведенный код в новой настройке проекта только для этого. Что-то нестандартное вызывает это, и вам решать, как это сделать. –  Caspar Harmer 15.10.2011 в 10:25
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
источник