FontMetrics не правильно при запуске на устройстве Android. Симулятор отлично - PullRequest
4 голосов
/ 10 марта 2011

У меня есть приложение для Android, которое динамически масштабирует текст в зависимости от разрешения устройства Android. Я протестировал этот код на всех предопределенных разрешениях в Android Simulator, и мой код работает нормально. (Это касается тех же разрешений, что и в HTC Desire и Motorola Droid)

Он также отлично работает на моем HTC Wildfire.

Вот несколько скриншотов с симуляторов:

enter image description here enter image description here enter image description here

Однако ... Я пробовал это в HTC Desire, и у меня были сообщения от пользователей, использующих Motorola Droid, о том, что шрифты не масштабируются правильно:

enter image description here

Обратите внимание, как отрубается текст.

Есть идеи, почему это не работает на этих конкретных устройствах?

В настоящее время у меня есть функция, которая уменьшает текст в зависимости от доступной высоты для текста ... что-то вроде этого:

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 Ответ

6 голосов
/ 20 мая 2011

Я хотел бы упомянуть две вещи.

По своему опыту я рассчитал высоту шрифта в пикселях, вычитая FontMetrics.top из FontMetrics.bottom.Это связано с положительными и отрицательными значениями для дна и верха по оси Y.Пожалуйста, обратитесь к документации Android для этого.Поэтому я бы изменил ваш метод CalcuHeight следующим образом:

public static float calculateHeight(FontMetrics fm) {
    return fm.bottom - fm.top;
}

Во-вторых, вы должны помнить, что ваш метод defineTextSize будет возвращать размер в пикселях.Если вы используете это для установки размера текста для TextView или чего-то еще, вам следует указать единицы измерения как TypedValue.COMPLEX_UNIT_PX.Единицей по умолчанию для этого метода является TypedValue.COMPLEX_UNIT_SP

...