上下文:
我正在尝试创建一个能够使用实际尺寸的应用程序。在我的特定情况下,如果不是100%准确,那就可以。但是,越精确越好。
例如:如果我要显示一个3厘米宽的正方形,而实际上我要显示一个2.8厘米宽的正方形,那是可以接受的。
问题:
虽然似乎有办法获得屏幕的宽度和高度(以像素为单位),但没有办法获得屏幕DPI或以cm / in为单位的屏幕宽度和高度。
我的问题:如何获取或计算屏幕的DPI?如果无法做到这一点,还有另一种尝试使用真实世界的测量方法的方法吗?
答案 0 :(得分:0)
您可以尝试使用React Native的PixelRatio.get()进行计算。此方法将返回一个乘数,其中1
等于一个mdpi屏幕(160 dpi
)。因此,如果PixelRatio.get()
返回1.5
,则显示为hdpi屏幕(160 * 1.5 = 240 dpi
)。
在mdpi屏幕上:
1 inch = 160 pixels
1 inch = 2.54 cm
-----------------------
1 cm = 62.992126 pixels
因此,要在此屏幕上渲染3cm宽的内容,必须为189像素。
例如,在xhdpi屏幕(PixelRatio.get() = 2
)上,
1 inch = 320 pixels
1 inch = 2.54 cm
-----------------------
1 cm = 125.98425 pixels
3厘米宽的东西必须为378像素。
答案 1 :(得分:0)
这并不完全正确,您正在计算 dpi 的近似值,而不是实际 dpi。
pixelRatio 介于真实像素和独立像素之间:
real pixel distance (px) = pixelRatio * independente pixel distance (dp)
以华为 Y9s (2019) 为例 来自https://yesviz.com/devices.php的指标
width in independant pixel = 360 dp
width in real pixel = 1080 px
density in independant pixel = 130 dip
density in real pixel = 391 dpi
ratio = 3
the upper formula gives us: 360dp * 3 ≈ 1080px => all good
but ratio = 3
is different from : dpi / 160 = 391 /160 = 2.44
Android 混淆了实际独立密度和桶密度值。 (https://www.youtube.com/watch?v=zhszwkcay2A)
但是渲染是不同的,如果你在两个苹果设备上显示一个 320dp 的 div:
Ipad Pro 12.9'' (2020) with 132 density in independant pixels => div is printed 61mm or 2.36inch on the screen
Iphone 11 (2019) with 163 density in independant pixels => div is printed 50mm or 2inch on the screen
因此从技术上讲,每个设备上与密度无关的像素可以近似为 160dip
以及相应的近似密度在实际像素中:桶密度值。我们称之为~dpi。可以用pixelRatio检索
~dpi = pixelRatio * 160