Documentation明确表示mm
和in
与屏幕尺寸有关。
毫米
毫米 - 基于屏幕的物理尺寸。
在
英寸 - 基于屏幕的物理尺寸。
但是当我使用它们时,Lint说:
避免使用“mm”作为单位(它在所有设备上都不能正常工作);使用“dp”代替
文档错了吗?为什么Lint在使用pt
?
pt
点数 - 基于屏幕物理尺寸的1/72英寸。
答案 0 :(得分:12)
为了能够对您的问题给出一个好的答案,我首先要解释一下DPI在Android中是如何工作的,所以这个答案有点长。
TL; DR:文档是正确的,但Lint的警告也是正确的。那就是有一些(错误?)设备mm
,in
和pt
无法正常工作。
在Android中,可以从DisplayMetrics类访问两种不同的密度度量:
dp
单位是根据densityDpi指标计算的,而mm
,in
和pt
单位则全部是根据xdpi / ydpi计算的。
根据他们为densityDpi和xdpi / ydpi报告的值,可以将设备划分为四个不同的类别:
示例设备:三星Galaxy Trend,Nexus 4,Nexus 7。
对于这些设备,如果您使用in
,mm
或dp
,这并不重要。如果你绘制一个边长为1 in
的正方形和一个带有160 dp
的正方形,它们将是相同的,并且在实际屏幕上都是1英寸左右。
第2类示例设备: HTC One S,Sony Xperia V,Sony Xperia Z Ultra。
第3类示例设备:三星Galaxy S4,Sony Xperia Z1,Nexus 5.
对于这些设备,densityDpi和xdpi / ydpi不同,因为densityDpi必须设置为其中一个可用密度桶。因此,真实的物理dpi被舍入以匹配最近的桶,这是报告为densityDPI值。这由Figure 1 in the Supporting Multiple Screens文档说明。
这意味着如果您绘制一个边1 in
的正方形和一个160 dp
的正方形,它们的尺寸会略有不同。对于类别2设备,160 dp
方块将略小,而对于类别3设备,它将略微更大。如果您取出标尺并在手机屏幕上物理测量方块,您会看到1 in
方格为1英寸,而160 dp
方格根据类别稍微或更大。< / p>
这是Android中密度桶系统的自然结果,但除非您对其工作原理有更深入的了解,否则使用固定dp度量绘制的内容在不同的手机上看起来可能会有所不同。
示例设备:三星Galaxy Mini,三星Galaxy S3 Mini。
这些设备问题较多,它们对densityDpi有很好的价值(它们的真实dpi四舍五入到最近的存储桶),但是它们会报告xdpi / ydpi的虚假值。
例如,三星Galaxy S3 Mini报告的xdpi为160,densityDpi为240.屏幕宽480像素,因此如果160 dpi是正确的,这将意味着屏幕宽度为3英寸,但实际上屏幕为2.05英寸。根据这些数字,手机应报告的实际xdpi值为234。
另一个例子是三星Galaxy Mini,它也报告xdpi为160,但是DensDpi设置为120.该屏幕宽240像素,因此物理宽度为1.5英寸,但实际屏幕为1.9英寸(实际的xdpi为126)。
因此,在这些类型的设备上,不可能信任in,mm,pt单位,因为它们会导致事物太小或太大。
这是我在第1,2和3类设备上拍摄的测试应用程序的三个屏幕截图。绿色方块根据使用xdpi和ydpi值绘制为1英寸大,而红色正方形使用dp(160 dp)绘制为1英寸大。
当用尺子物理测量结果时,所有这些示例中的绿色正方形都是英寸大,而红色正方形尺寸有所不同,因为它在屏幕截图上可见。
这是第4类设备的屏幕截图。绿色和红色方块与前一个示例相同,但在这里我还添加了两个方块,一个是1 in
的黄色方块和一个72 pt
的蓝色方块。如屏幕截图所示,除红色方块外的所有方块都具有相同的大小。
当用尺子物理测量结果时,红色正方形大约一英寸大,而其余正方形只有0.67英寸大。
来自Lint的警告指的是类别4类型的设备,它们返回xdpi和ydpi的错误值。由于在这些设备上无法信任xdpi / ydpi,因此依赖于它们的单位(mm
,in
,pt
)也不可信任。
文档错了吗?
没有文档正确,这些单位基于屏幕的物理尺寸。然而,一些有问题的设备报告错误的屏幕物理尺寸值(xdpi / ydpi)到Android,然后这些单位也是错误的。
为什么Lint在使用pt时不会发出警告?
Lint开发人员可能只是忘记了pt
,它与in
和mm
一样有问题。
Lint建议使用dp
的原因是因为这是一个在Android中非常频繁使用的单位,所以如果任何设备损坏dp
单位几乎所有应用程序看起来都很糟糕,那就是在设备上市之前已经修复。