FontMetrics не правильно при запуске на устройстве Android. Симулятор отлично
У меня есть приложение для Android, которое динамически масштабирует текст в зависимости от разрешения устройства Android. Я протестировал этот код на всех предопределенных разрешениях в Android Simulator, и мой код работает нормально. (Это касается тех же разрешений, что и в HTC Desire и Motorola Droid)
Он также отлично работает на моем HTC Wildfire.
Вот несколько скриншотов с симуляторов:
Однако... Я пробовал это в HTC Desire, и у меня были сообщения от пользователей, использующих Motorola Droid, о том, что шрифты не масштабируются правильно:
Обратите внимание, как это отрубает текст.
Есть идеи, почему это не работает на этих конкретных устройствах?
В настоящее время у меня есть функция, которая масштабирует текст в зависимости от доступной высоты для текста... что-то вроде этого:
public static float calculateHeight(FontMetrics fm) {
return Math.abs(fm.ascent) + fm.descent;
}
public static int determineTextSize(Typeface font, float allowableHeight) {
Paint p = new Paint();
p.setTypeface(font);
int size = (int) allowableHeight;
p.setTextSize(size);
float currentHeight = calculateHeight(p.getFontMetrics());
while (size!=0 && (currentHeight) > allowableHeight) {
p.setTextSize(size--);
currentHeight = calculateHeight(p.getFontMetrics());
}
if (size==0) {
System.out.print("Using Allowable Height!!");
return (int) allowableHeight;
}
System.out.print("Using size " + size);
return size;
}
Есть идеи, почему это происходит только на нескольких устройствах? и как я могу это исправить? Есть ли другая метрика шрифта, которую мне не нужно рассматривать здесь, о которой я не знаю? Нравится Scale или DPI?
Благодарю.
1 ответ
Я хотел бы упомянуть две вещи.
По своему опыту я вычислил высоту шрифта в пикселях, вычитая FontMetrics.top из FontMetrics.bottom. Это связано с положительными и отрицательными значениями для дна и верха по оси Y. Пожалуйста, смотрите документацию по Android для этого. Так что я бы изменил ваш метод calcHeight следующим образом:
public static float calculateHeight(FontMetrics fm) {
return fm.bottom - fm.top;
}
Во-вторых, вы должны помнить, что ваш метод defineTextSize возвращает размер в пикселях. Если вы используете это для установки размера текста для TextView или чего-то еще, вам следует указать единицы измерения как TypedValue.COMPLEX_UNIT_PX. Единицей по умолчанию для этого метода является TypedValue.COMPLEX_UNIT_SP