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

M-W*_*eEh 4 android android-layout

文档明确说明并且mmin屏幕大小有关.

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

in
Inches - 基于屏幕的物理尺寸.

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

避免使用"mm"作为单位(它不能在所有设备上准确工作); 请改用"dp"

文档错了吗?为什么Lint在使用时不会发出警告pt

PT
点-基于屏幕的物理尺寸为1/72英寸.

nib*_*ius 13

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

TL; DR:文档是正确的,但Lint的警告也是正确的.那是有一些(错误?)设备在哪里mm,in并且pt无法正常工作.

Android中的DPI

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

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

dp单元是基于densityDpi度量而计算出的mm,inpt单元全部基础计算的xdpi/ydpi代替.

报告的价值观

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

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

类别1(densityDpi与xdpi/ydpi相同)

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

对于这些设备,如果你使用,或in,它并不重要.如果你绘制一个带有边和一个边的正方形,它们将是相同的,并且在实际屏幕上都将是大约1英寸.mmdp1 in160 dp

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

第2类示例设备: HTC One S,Sony Xperia V,Sony Xperia Z Ultra.
3类示例设备:三星Galaxy S4,索尼Xperia Z1,Nexus 5.

对于这些设备,densityDpi和xdpi/ydpi不同,因为densityDpi必须设置为可用密度桶之一.因此,真实的物理dpi被舍入以匹配最近的桶,这是报告为densityDPI值.图1在Supporting Multiple Screens文档中对此进行了说明.

这意味着如果你绘制一个带边1 in和一边的正方形,160 dp它们的尺寸会略有不同.对于2类设备,160 dp方块将略小,而对于3类设备,它将略微更大.如果您拿出一把尺子并在手机屏幕上物理测量方块,您会看到1 in方形是1英寸,而160 dp方形根据类别稍微或更大.

这是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类

1-3类设备的比较

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

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

第4类

类别4设备的屏幕截图

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

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

这个问题的答案

来自Lint的警告指的是类别4类型的设备,它们返回xdpi和ydpi的错误值.由于xdpi/ydpi不能这些设备中的单元(可信mm,in,pt依赖于它们)不能被任何可信的.

文档错了吗?

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

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

Lint的开发人员可能只是忘记了pt,它in和and mm.一样有问题.

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

  • 很高兴有帮助。我需要自己理解这一点,而最好的方法通常是向其他人解释。 (3认同)