在 Android 设备上运行时 FontMetrics 不正确。模拟器没问题

发布于 2024-10-21 08:30:15 字数 1452 浏览 1 评论 0原文

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

谢谢。

I have an Android App that dynamically scales text depending on the resolution of the android device.
I have tested this code on all the predefined resolutions in the Android Simulator and my code works fine. (This includes the same resolutions as on HTC Desire and Motorola Droid)

It also works fine on my HTC Wildfire.

Here are some screen shots from the simulators:

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

However... I have tried this on HTC Desire, and I have had reports from users using Motorola Droid that the fonts are not scaling correctly:

enter image description here

Note how it is chopping the text off.

Any ideas why this is not working on these particular devices?

I currently have a function that scales the text down depending on the available height for the text... something like this:

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;
}

Any ideas why this is happening on only a couple of devices? and how I can fix it?
Is there another font metric than I need to be considering here which I don't know about? Like Scale or DPI?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦归所梦 2024-10-28 08:30:15

有两件事我想提一下。

根据我的经验,我通过从 FontMetrics.bottom 中减去 FontMetrics.top 来计算字体高度(以像素为单位)。这是由于 Y 轴底部和顶部的正值和负值造成的。请参阅 android 文档了解这一点。因此,我将按如下方式更改您的calculateHeight 方法:

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

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

There are two things I would like to mention.

In my experience I have calculated font height in pixels by subtracting FontMetrics.top from FontMetrics.bottom. This is due to the positive and negative values for bottom and top as per Y axis. Please see android documentation for this. So I would change your calculateHeight method as follows:

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

Secondly you should remember that your determineTextSize method would return the size in pixels. If you are using this to set the Text Size of a TextView or something then you should specify the units as TypedValue.COMPLEX_UNIT_PX. The default unit for this method is TypedValue.COMPLEX_UNIT_SP

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文