当使用(英寸)或毫米(毫米)单位作为尺寸时,为什么Lint会显示警告?

时间:2013-12-17 10:08:02

标签: android android-layout

Documentation明确表示mmin与屏幕尺寸有关。

  

毫米   
毫米 - 基于屏幕的物理尺寸。

     

在   
英寸 - 基于屏幕的物理尺寸。

但是当我使用它们时,Lint说:

  

避免使用“mm”作为单位(它在所有设备上都不能正常工作);使用“dp”代替

文档错了吗?为什么Lint在使用pt

时不会发出警告
  

pt
  点数 - 基于屏幕物理尺寸的1/72英寸。

1 个答案:

答案 0 :(得分:12)

为了能够对您的问题给出一个好的答案,我首先要解释一下DPI在Android中是如何工作的,所以这个答案有点长。

TL; DR:文档是正确的,但Lint的警告也是正确的。那就是有一些(错误?)设备mminpt无法正常工作。

Android中的DPI

在Android中,可以从DisplayMetrics类访问两种不同的密度度量:

  • densityDpi - 屏幕密度以每英寸点数表示。此值始终设置为Android中可用的广义密度存储桶之一(例如,中/ 160,高/ 240,超高/ 320)。
  • xdpi / ydpi - X / Y维度中每英寸屏幕的确切物理像素数。这个值与densityDpi略有不同,这取决于设备的屏幕尺寸和分辨率,这种情况并不少见。

dp单位是根据densityDpi指标计算的,而mminpt单位则全部是根据xdpi / ydpi计算的。

报告值

根据他们为densityDpi和xdpi / ydpi报告的值,可以将设备划分为四个不同的类别:

  1. densityDpi与xdpi / ydpi几乎相同或相同。
  2. densityDpi明显小于xdpi / ydpi
  3. densityDpi明显大于xdpi / ydpi
  4. xdpi / ydpi值完全错误。
  5. 类别1(densityDpi与xdpi / ydpi相同)

    示例设备:三星Galaxy Trend,Nexus 4,Nexus 7。

    对于这些设备,如果您使用inmmdp,这并不重要。如果你绘制一个边长为1 in的正方形和一个带有160 dp的正方形,它们将是相同的,并且在实际屏幕上都是1英寸左右。

    2类& 3(densityDpi不同于xdpi / ydpi)

    第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度量绘制的内容在不同的手机上看起来可能会有所不同。

    类别4(不正确的xdpi / ydpi值)

    示例设备:三星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-3类

    Comparison of category 1-3 devices

    这是我在第1,2和3类设备上拍摄的测试应用程序的三个屏幕截图。绿色方块根据使用xdpi和ydpi值绘制为1英寸大,而红色正方形使用dp(160 dp)绘制为1英寸大。

    当用尺子物理测量结果时,所有这些示例中的绿色正方形都是英寸大,而红色正方形尺寸有所不同,因为它在屏幕截图上可见。

    第4类

    Screenshot from category 4 device

    这是第4类设备的屏幕截图。绿色和红色方块与前一个示例相同,但在这里我还添加了两个方块,一个是1 in的黄色方块和一个72 pt的蓝色方块。如屏幕截图所示,除红色方块外的所有方块都具有相同的大小。

    当用尺子物理测量结果时,红色正方形大约一英寸大,而其余正方形只有0.67英寸大。

    问题的答案

    来自Lint的警告指的是类别4类型的设备,它们返回xdpi和ydpi的错误值。由于在这些设备上无法信任xdpi / ydpi,因此依赖于它们的单位(mminpt)也不可信任。

      

    文档错了吗?

    没有文档正确,这些单位基于屏幕的物理尺寸。然而,一些有问题的设备报告错误的屏幕物理尺寸值(xdpi / ydpi)到Android,然后这些单位也是错误的。

      

    为什么Lint在使用pt时不会发出警告?

    Lint开发人员可能只是忘记了pt,它与inmm一样有问题。

    Lint建议使用dp的原因是因为这是一个在Android中非常频繁使用的单位,所以如果任何设备损坏dp单位几乎所有应用程序看起来都很糟糕,那就是在设备上市之前已经修复。