我有两个设备 - HTC Tattoo和索尼爱立信Xperia X10。一个有145 DPI,另一个有245 DPI。
当我以点为单位指定TextView的字体大小时,如下所示:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PT, 6.5f);
我在这两个设备上获得了不同的文本物理大小。在245 DPI上,文本几乎不可读。
现在,“pt”大小应该是物理的。即,在我的测试中,两个文本块都应该具有相同物理高度的字母。事实并非如此。
这里有什么不妥?
感谢您的帮助, 由里。
答案 0 :(得分:6)
pt
单位是分数,不会根据密度进行缩放。对于非文本,您需要dip
(或dp
),它们是密度无关的像素。这些将根据密度进行缩放。对于文本,您需要sp
,它将根据密度进行缩放,但也会根据用户的首选字体大小进行缩放。
这里有一些信息,也分散在Android文档的其他地方。
http://developer.android.com/guide/practices/screens_support.html#screen-independence
更新:这里是每个维度单位的描述,正如Yuri正确指出的那样,确实pt
应该始终是物理屏幕上的1/72英寸。它似乎没有那样工作,答案只是使用dp
和sp
- 如果你想向你的用户公开点数,只需做一些数学运算({{1可以假设在160dpi屏幕上为1px,即1/160英寸)。
http://developer.android.com/guide/topics/resources/more-resources.html#Dimension
答案 1 :(得分: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 - 这是错误的,但我没有看到任何其他方式。