在 React Native 中获取屏幕 DPI
Get screen DPI in react native
上下文:
我正在尝试创建一个能够使用真实世界维度的应用程序。在我的特殊情况下,即使不是 100% 准确也没关系;但是,越准确越好。
例如:如果我试图展示一个 3 厘米宽的正方形,而实际上我展示了一个 2.8 厘米宽的正方形,这是可以接受的。
问题:
虽然似乎有办法以像素为单位获取屏幕的宽度和高度,但无法以 cm/in 获取屏幕 DPI 或屏幕的宽度和高度。
我的问题:如何获取或计算屏幕的 DPI?如果这不可能,是否有另一种方法可以尝试使用真实世界的测量值?
您可以尝试使用 React Native 的 PixelRatio.get() 来计算。此方法将 return 乘数 1
等于 mdpi 屏幕 (160 dpi
)。因此,如果 PixelRatio.get()
returns 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 像素。
这不完全正确,您正在计算 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)
但是渲染是不同的,如果你在两个苹果设备上显示一个 div 的 320dp :
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
而相应的approximation of density in real pixel: 桶密度值。我们称它为 ~dpi。可以用 pixelRatio
检索
~dpi = pixelRatio * 160
上下文:
我正在尝试创建一个能够使用真实世界维度的应用程序。在我的特殊情况下,即使不是 100% 准确也没关系;但是,越准确越好。
例如:如果我试图展示一个 3 厘米宽的正方形,而实际上我展示了一个 2.8 厘米宽的正方形,这是可以接受的。
问题:
虽然似乎有办法以像素为单位获取屏幕的宽度和高度,但无法以 cm/in 获取屏幕 DPI 或屏幕的宽度和高度。
我的问题:如何获取或计算屏幕的 DPI?如果这不可能,是否有另一种方法可以尝试使用真实世界的测量值?
您可以尝试使用 React Native 的 PixelRatio.get() 来计算。此方法将 return 乘数 1
等于 mdpi 屏幕 (160 dpi
)。因此,如果 PixelRatio.get()
returns 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 像素。
这不完全正确,您正在计算 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)
但是渲染是不同的,如果你在两个苹果设备上显示一个 div 的 320dp :
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
而相应的approximation of density in real pixel: 桶密度值。我们称它为 ~dpi。可以用 pixelRatio
检索~dpi = pixelRatio * 160