在我的Pixel 7设备上,我想知道我有多少密度无关像素(dp)。所以,我使用这个公式:
displayMetrics.widthPixels / displayMetrics.density
然而,我有一个问题,因为displayMetrics.widthPixels = 1080
(这是好的)和displayMetrics.density = 2.625
。当我计算1080 / 2.625时,它等于411.428571密度无关像素,这不是一个整数。似乎displayMetrics.density = 2.625可能是不正确的,因为它是不寻常的,有一个密度无关像素的分数。
我如何获得displayMetrics.density的正确值?我假设它是2.62135922,这将导致412个与密度无关的像素,使其看起来更具有视觉吸引力。
2条答案
按热度按时间ddhy6vgd1#
但
density
实际上是float
的一种类型:公众彩车密度
[...]此值并不完全遵循真实的屏幕大小(由
xdpi
和ydpi
给出),而是用于根据显示dpi的总体变化逐步缩放整个UI的大小。https://developer.android.com/reference/android/util/DisplayMetrics#density
8gsdolmq2#
看看Android的官方dp-px转换公式,你可以说你的计算是正确的。
displayMetrics.density
也没有错。问题是,一个dp是一个虚拟像素单位,大致等于中等密度屏幕上的一个像素(160 dpi,或“基线”密度)。Android将此值转换为每个密度的适当真实的像素数。
这个
dp
的定义是依赖于平台的,例如Windows有另一个。气体密度定义为
dpi/160
。然而,正如圣经所说
永远不要硬编码这个等式
从
dp
到px
的转换应该使用applyDimension()
。类似地,deriveDimension()
将px
转换为dp
。现在你说:“等一下,
deriveDimension()
只支持安卓14,这段时间怎么办?”注意,
applyDimension()
和deriveDimension()
都返回float
值。文档中的applyDimension()
示例对结果应用了Integer类型转换。所以--现在继续使用您的公式,只需添加结果到Integer的类型转换。