4

我有一个 Android 应用程序,它可以根据 android 设备的分辨率动态缩放文本。我已经在 Android 模拟器中的所有预定义分辨率上测试了这段代码,并且我的代码运行良好。(这包括与 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;
}

任何想法为什么只在几个设备上发生这种情况?以及我该如何解决?是否还有其他我不知道的字体指标需要在这里考虑?像比例或 DPI?

谢谢。

4

1 回答 1

6

我想提两件事。

根据我的经验,我通过从 FontMetrics.bottom 中减去 FontMetrics.top 来计算以像素为单位的字体高度。这是由于根据 Y 轴的底部和顶部的正值和负值。请参阅 android 文档。所以我会改变你的 calculateHeight 方法如下:

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

其次,您应该记住您的 determineTextSize 方法将返回以像素为单位的大小。如果您使用它来设置 TextView 或其他东西的文本大小,那么您应该将单位指定为 TypedValue.COMPLEX_UNIT_PX。此方法的默认单位是 TypedValue.COMPLEX_UNIT_SP

于 2011-05-20T06:34:44.943 回答