我对我所阅读的here感到有点担心,这意味着根据px
和屏幕密度计算dp
没有可靠的公式(反之亦然) ):
dp: 密度无关像素 - 基于屏幕物理密度的抽象单位。这些单位相对于160 dpi(每英寸点数)的屏幕,其中1dp大致等于1px。在较高密度屏幕上运行时,用于绘制1dp的像素数按照适合屏幕dpi的系数放大。同样,当在较低密度屏幕上时,用于1dp的像素数按比例缩小。 dp-to-pixel的比率将随着屏幕密度而变化,但不一定成正比。使用dp单位(而不是px单位)是在布局中制作视图尺寸的简单解决方案针对不同的屏幕密度正确调整大小。换句话说,它为不同设备的UI元素的实际大小提供了一致性。
我认为我们总是可以使用以下公式(解释here):
px = dp * (dpi / 160)
但是,this question中的证词似乎突出显示dp
中指定尺寸并不能保证跨设备的固定感知尺寸的情况。
粗体句子的真正含义是什么?
我们是否需要使用mm
才能确保保持相同的感知大小?
答案 0 :(得分:1)
我认为我们总是可以使用以下公式(在此解释):px = dp *(dpi / 160)
此公式始终可用于在像素和dp之间进行转换。只需确保在公式中使用DisplayMetrics.densityDpi作为dpi的值。
然而,这个问题中的证词似乎突出了一个案例,即在dp中指定大小并不能保证跨设备的固定感知大小。
是的,某个dp不能保证跨设备的固定感知大小。但它确保了跨设备的相似感知大小。原因是在某些设备上,DensDpi(密度桶)与设备的physical dpi不同。有关详细信息,请参阅my answer与您关联的问题。
dp与像素的比率将随着屏幕密度而变化,但不一定是直接比例
这里我认为它们是指实际的屏幕密度,当他们说“屏幕密度”而不是手机所属的密度桶时。
例如,物理dpi为270的设备属于“高”(240)密度桶,dp与像素的比率为240/160 = 1.5
另一个物理dpi为290的设备属于“xhigh”(320)密度桶,dp-to-pixel比率为320/160 = 2
当您将这些设备相互比较时,物理屏幕密度增加了7%(270 - > 290),而dp到像素比率增加了33%(1.5 - > 2),所以它不是他们之间的直接比例。
我们是否需要使用mm才能确保保持相同的感知大小?
如果设备之间的先前尺寸尽可能相似,则必须使用mm或inch。然而,正如我在你所链接的问题中提到的那样,这有一些缺点。
同样重要的是要记住,有些设备的mm和inch单位都坏了,有关详细信息,请参阅问题Why Lint shows warning when using in (inch) or mm (millimeter) units as dimension?