android 为什么displayMetrics.density是错误的?

von4xj4u  于 2023-04-28  发布在  Android
关注(0)|答案(2)|浏览(114)

在我的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个与密度无关的像素,使其看起来更具有视觉吸引力。

ddhy6vgd

ddhy6vgd1#

density实际上是float的一种类型:

公众彩车密度

[...]此值并不完全遵循真实的屏幕大小(由xdpiydpi给出),而是用于根据显示dpi的总体变化逐步缩放整个UI的大小。
https://developer.android.com/reference/android/util/DisplayMetrics#density

8gsdolmq

8gsdolmq2#

看看Android的官方dp-px转换公式,你可以说你的计算是正确的。displayMetrics.density也没有错。问题是,
一个dp是一个虚拟像素单位,大致等于中等密度屏幕上的一个像素(160 dpi,或“基线”密度)。Android将此值转换为每个密度的适当真实的像素数。
这个dp的定义是依赖于平台的,例如Windows有另一个。

px = dp * (dpi / 160)
<=> px = dp * displayMetrics.density
<=> dp = px / displayMetrics.density
<=> dp = displayMetrics.widthPixels / displayMetrics.density

气体密度定义为dpi/160
然而,正如圣经所说
永远不要硬编码这个等式
dppx的转换应该使用applyDimension()。类似地,deriveDimension()px转换为dp
现在你说:“等一下,deriveDimension()只支持安卓14,这段时间怎么办?”
注意,applyDimension()deriveDimension()都返回float值。文档中的applyDimension()示例对结果应用了Integer类型转换。
所以--现在继续使用您的公式,只需添加结果到Integer的类型转换。

相关问题