在 Android 设备上运行时,FontMetrics 不正确。模拟器不错

Posted

技术标签:

【中文标题】在 Android 设备上运行时,FontMetrics 不正确。模拟器不错【英文标题】:FontMetrics not correct when run on android device. Simulator fine 【发布时间】:2011-03-10 11:25:23 【问题描述】:

我有一个 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?

谢谢。

【问题讨论】:

【参考方案1】:

我想提两件事。

根据我的经验,我通过从 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

【讨论】:

谢谢阿努帕姆。我不知道这两个文本大小单位。使用 COMPLEX_UNIT_PX 设置文本大小,解决了我在 HTC Desire 和 Motorola Droid 上看到的问题。非常感谢。

以上是关于在 Android 设备上运行时,FontMetrics 不正确。模拟器不错的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Android 设备上运行 Geolocation 时如何解决 Babel 问题?

我的 android studio 项目在棒棒糖上运行良好,但在 kitkat 设备上测试时崩溃

当应用程序在真正的Android设备上运行时,虚线实际上不是虚线

在 mac 上使用真正的 android 设备运行自动化测试时,是不是可以将上下文切换到 WebView?

仅在物理设备而非模拟器上运行 Android 应用程序

Flutter 应用程序在 Android 模拟器上运行,但不在物理设备上(OnePlus 7T)