在React Native中获取屏幕DPI

6

背景:

我正在尝试创建一个可以使用真实世界尺寸的应用程序。 在我的特定情况下,如果不是100%精确也可以接受; 但是,越准确越好。

例如:如果我试图显示一个3厘米宽的正方形,并且实际上显示了一个2.8厘米宽的正方形,则可以接受。

问题:

虽然似乎有一些方法可以获取屏幕的宽度和高度(以像素为单位),但无法获取屏幕DPI或屏幕的宽度和高度(以厘米/英寸为单位)。

我的问题:如何获取或计算屏幕的DPI? 如果这不可能,是否有其他方法来尝试使用真实世界的测量值?

2个回答

14
你可以尝试使用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

因此,在这个屏幕上呈现3厘米宽的东西,需要189像素。

同样地,在xhdpi屏幕(例如PixelRatio.get() = 2)上:

1 inch = 320 pixels
1 inch = 2.54 cm
-----------------------
1 cm = 125.98425 pixels

一个宽度为3厘米的物品需要有378个像素。


1
这并不完全准确,你正在计算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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接