Физический размер шрифта в точках в Android

У меня два устройства - HTC Tattoo и Sony Ericsson Xperia X10. У одного 145 DPI, у другого 245 DPI.

Когда я указываю размер шрифта для TextView в точках, например:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PT, 6.5f);

Я получаю различный физический размер текста на этих двух устройствах. При разрешении 245 DPI текст едва читается.

Теперь размер «pt» должен быть физическим. То есть в моем тесте оба текстовых блока должны иметь буквы одинаковой физической высоты. Это не так.

Что здесь может быть не так?

Спасибо за помощь, Юрий.


person Yuri Ushakov    schedule 03.08.2010    source источник
comment
См. мою запись в блоге о размере точек systemdotrun. blogspot.co.uk/2014/09/?. Это плюс ответ ниже - все, что вам нужно знать! stackoverflow.com/a/3414215/236743   -  person Dori    schedule 06.10.2014


Ответы (2)


Единица измерения pt — это точки, которые не масштабируются в соответствии с плотностью. Для нетекста вам нужны dip (или dp), которые являются независимыми от плотности пикселями. Они будут масштабироваться в соответствии с плотностью. Для текста вам нужен sp, который будет масштабироваться в соответствии с плотностью, а также в соответствии с предпочтительным размером шрифта пользователя.

Немного информации об этом есть здесь, а также разбросано по другим документам Android.

http://developer.android.com/guide/practices/screens_support.html#screen-independence

ОБНОВЛЕНИЕ: вот описания каждой из единиц измерения, которые, как справедливо указывает Юрий, предполагают, что pt всегда должно быть 1/72 дюйма на физическом экране. Это просто не работает таким образом, и ответ заключается в том, чтобы просто использовать dp и sp - если вы хотите показать что-то вроде точек вашему пользователю, просто сделайте некоторые математические расчеты (можно предположить, что dp равно 1px на экране 160 точек на дюйм , то есть 1/160 дюйма).

http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

person Nick    schedule 03.08.2010
comment
Согласно документу: Очки - 1/72 дюйма в зависимости от физического размера экрана. Независимо от плотности. Неважно что. Так же, как миллиметр всегда миллиметр на любом дисплее. 1/72 дюйма — это 1/72 дюйма, независимо от того, сколько пикселей это займет. Позвольте мне объяснить о моем выборе. Пункты являются стандартной единицей шрифта для многих приложений. Пользователи не хотят указывать свои размеры шрифта на основе какой-то новой единицы измерения. Очки стандартные и банальные. В браузере ПК, приложениях Microsoft Word, Notepad и Mac. - person Yuri Ushakov; 03.08.2010
comment
Да, в документации написано, что pt всегда должен иметь один и тот же физический размер, это немного вводит в заблуждение. Но dp и sp кажутся рекомендуемыми единицами измерения. 1dp — это 1 пиксель на экране с разрешением 160 точек на дюйм (т. е. это 1/160 дюйма), поэтому, если вы хотите выставить точки, эквивалентные вашим пользователям, это будет просто математическое преобразование. - person Nick; 03.08.2010

На самом деле точки работают всегда, когда базовые устройства дают правильные показатели отображения.

Например, я протестировал пять устройств:

NAME      OS    metrics.ydpi  REAL_DPI  DDPI  SD
XPERIA    1.6   159.49677     325       240   1.5
Liquid    1.6   263.8958      285       240   1.5
Tattoo    1.6   145.14067     match     120   0.75
Hero      1.5   179.29352     match     -     1.0
Galaxy    1.6   160.41878     180       160   1.0

Как видно, только HTC Tattoo и HTC Hero передают правильную информацию об отображении в Android API.

Вот почему точки имеют разные физические размеры на разных устройствах (хотя и не на всех).

Единственный способ грубо масштабировать шрифты/изображения, который я нашел, - это предположить, что все имеет разрешение 160 DPI, и использовать DisplayMetrics#scaledDensity, что неверно, но я не вижу другого пути.

person Yuri Ushakov    schedule 05.08.2010
comment
Другим способом может быть использование базы данных устройств, по крайней мере, для самых популярных. - person southerton; 03.09.2014
comment
Кто-нибудь знает, работает ли это лучше 6 лет спустя? - person androidguy; 15.10.2016