Documentation明确表示mmin取决于屏幕大小。


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


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


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


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


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


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

最佳答案

为了能够很好地回答您的问题,我首先必须对DPI在Android中的工作方式进行说明,因此该答案有点长。
TL; DR:文档正确,但是Lint发出的警告也正确。那就是有些(越野车?)设备在mminpt无法正常工作的情况。
Android中的DPI
在Android中,可以从DisplayMetrics类访问两种不同的密度度量:

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

dp单位是根据densityDpi度量计算的,而mminpt单位都是根据xdpi / ydpi计算的。
报告值
可以根据设备报告的densityDpi和xdpi / ydpi值将其分为四个不同的类别:

densityDpi几乎相同,或与xdpi / ydpi相同。
densityDpi明显小于xdpi / ydpi
densityDpi明显大于xdpi / ydpi
xdpi / ydpi值完全错误。

类别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,索尼Xperia Z1,Nexus 5。
对于这些设备,密度Dpi和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正方形则根据类别而变小或变大。
这是Android中的密度桶系统的自然结果,但是除非您对它的工作原理有更深入的了解,否则使用固定dp度量绘制的内容在不同的手机上看起来可能会有些奇怪。
类别4(错误的xdpi / ydpi值)
示例设备:三星Galaxy Mini,三星Galaxy S3 Mini。
这些设备存在更多问题,它们的densityDpi值很高(它们的真实dpi舍入到最近的存储桶),但它们报告的xdpi / ydpi伪造的值。
例如,三星Galaxy S3 Mini报告的xdpi为160,密度Dpi为240。屏幕为480 px宽,因此,如果160 dpi是正确的,则意味着屏幕宽度为3英寸,但实际上屏幕为2.05英寸。根据这些数字,电话应报告的实际xdpi值为234。
另一个示例是三星Galaxy Mini,它也报告xdpi为160,但densityDpi设置为120。该屏幕为240 px宽,因此物理宽度为1.5英寸,但实际上屏幕为1.9英寸(实际xdpi)的126)。
因此,在这些类型的设备上,无法信任in,mm,pt单位,因为它们会导致事物变得太小或太大。
例子
类别1-3

这是我在类别1、2和3的设备上拍摄的测试应用程序的三个屏幕截图。基于使用xdpi和ydpi值,绿色正方形被绘制为1英寸大,而红色正方形被绘制为1。使用dp(160 dp)英寸大。
在所有这些示例中,用尺子实际测量结果时,绿色正方形的大小都为英寸大,而红色正方形的大小则有所不同,如屏幕截图所示。
第4类

这是类别4设备的屏幕截图。绿色和红色正方形与前面的示例相同,但是在这里我还添加了两个正方形,一个黄色正方形为1 in和一个蓝色正方形为72 pt。如屏幕截图所示,除红色方块外,所有其他方块的大小均相等。
用尺子实际测量结果时,红色正方形大约大一英寸,而其余正方形大约只有0.67英寸大。
问题的答案
Lint发出的警告是指类别4类型的设备,它们为xdpi和ydpi返回错误的值。由于不能在这些设备上信任xdpi / ydpi,因此依赖于它们的单位(mminpt)也不能被信任。

文档错误吗?

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

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

Lint开发人员可能只是忘记了pt,它与inmm一样有问题。
林特(Lint)建议改用dp的原因是,这是一个在Android中非常频繁使用的单元,因此,如果任何设备损坏了dp单元,几乎所有应用程序都将看起来很恐怖,并且在发布该设备之前将其修复。市场。

08-18 06:52