Android 中字体大小的物理尺寸(以点为单位)

3
我有两个设备 - HTC Tattoo和Sony Ericsson Xperia X10。一个的DPI为145,另一个的DPI为245。
当我在TextView中指定字体大小时,像这样:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PT, 6.5f);

这里需要注意的是我在这两个设备上得到了不同的文本物理大小。在245 DPI的设备上,文本几乎无法阅读。
现在,“pt”大小应该是物理的。也就是说,在我的测试中,两个文本块的字母高度应该是相同的。但事实并非如此。
可能出了什么问题呢?
谢谢你的帮助, Yuri。

请查看我的博客文章,了解有关点大小的信息http://systemdotrun.blogspot.co.uk/2014/09/whats-point-in-font-sizing.html?这篇文章和下面的答案就是您需要知道的全部内容!https://dev59.com/rk_Ta4cB1Zd3GeqPBYNm#3414215 - Dori
2个回答

6
pt单位表示点,不会根据密度进行缩放。对于非文本内容,您需要使用密度无关像素dip(或dp),这些将根据密度进行缩放。对于文本,您需要使用sp,它将根据密度进行缩放,但还将根据用户首选字体大小进行调整。
在此处有一些相关信息,并且还可以在Android文档中找到其他分散的信息。 http://developer.android.com/guide/practices/screens_support.html#screen-independence 更新:以下是每个维度单位的描述,正如Yuri所指出的那样,它确实表明pt应始终为物理屏幕上的1/72英寸。但它似乎并没有按照这种方式工作,答案就是使用dpsp - 如果您想向用户公开类似于点的东西,请进行一些数学计算(可以假设dp在160dpi的屏幕上为1px,即1/160英寸)。 http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

根据文档:“点 - 基于屏幕的物理尺寸的1/72英寸。” 不管密度如何,不管其他任何事情。就像毫米在任何显示器上都是毫米一样。 1/72英寸就是1/72英寸,无论需要多少像素。让我解释一下我的选择。对于许多应用程序而言,点是标准字体单位。用户不想基于某种新的测量单位指定其字体大小。点是标准和常见的,在您的PC浏览器、Microsoft Word、记事本和Mac应用程序中都可以使用。 - Yuri Ushakov
是的,文档确实读起来好像pt应该始终保持相同的物理大小,这有点误导人。但是dp和sp似乎是推荐的单位。在160dpi屏幕上,1dp等于1px(即它是1/160英寸),因此,如果您想向用户公开一个等效于点数的值,那么只需要进行简单的数学转换即可。 - Nick

5

实际上,只要底层设备提供正确的显示度量标准,点总是有效的。

例如,我测试了五个设备:

NAME      OS    metrics.ydpi  REAL_DPI  DDPI  SD
XPERIA    1.6   159.49677     325       240   1.5
Liquid    1.6   263.8958      285       240   1.5
Tattoo    1.6   145.14067     match     120   0.75
Hero      1.5   179.29352     match     -     1.0
Galaxy    1.6   160.41878     180       160   1.0

可以看出,只有HTC Tattoo和HTC Hero向Android API提供了正确的显示信息。

这就是为什么在不同设备上点的物理大小不同(虽然并非全部都是如此)。

我找到的唯一粗略缩放字体/图像的方法是假定所有东西都是160 DPI,并使用DisplayMetrics#scaledDensity-这是错误的,但我没有看到其他方法。


另一种方法可能是使用设备数据库,至少针对最流行的设备。 - Kurovsky
有人知道这个在6年后是否更好用吗? - androidguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接