在 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设备上运行时,虚线实际上不是虚线