在React Native中获取屏幕DPI

时间:2019-06-04 20:59:35

标签: react-native dpi

上下文:

我正在尝试创建一个能够使用实际尺寸的应用程序。在我的特定情况下,如果不是100%准确,那就可以。但是,越精确越好。

例如:如果我要显示一个3厘米宽的正方形,而实际上我要显示一个2.8厘米宽的正方形,那是可以接受的。

问题:

虽然似乎有办法获得屏幕的宽度和高度(以像素为单位),但没有办法获得屏幕DPI或以cm / in为单位的屏幕宽度和高度。

我的问题:如何获取或计算屏幕的DPI?如果无法做到这一点,还有另一种尝试使用真实世界的测量方法的方法吗?

2 个答案:

答案 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