ReactNative中的pixelRatio

关于pixelRatio,官方文档有相关内容。通过

PixelRatio.get()

接口可以获取到设备的像素密度,但有的同学不清楚这个像素密度做什么用的,比如我发现在项目里,给图片设置尺寸时,都乘以了这个像素密度值,实际上这是不对的。

手机屏幕像素是大家都知道的,比如1080*1920,他们指的是物理像素。除此之外还有一个参数叫做设备独立像素,在这里可以看到部分移动设备的相关参数。这个设备独立像素,我们用Dimensions API可以获取到

import {Dimensions} from "react-native"
let size = Dimensions.get("window");
console.log("width: " size.width + " height: " + size.height);

而像素密度比pixelRatio,就是物理像素除以独立像素的值。比如我手里的坚果pro,它的物理像素是1080*1920,设备独立像素是360*640,所以它的像素密度是3。 在上面界面里也可以看到,例如ipad, GalaxyTab等平板一般像素密度是1,中断设备像素密度是2,高端些的设备像素密度就是3,当然也有一些设备像素密度是1.5或者2.5等。

首先我们要明确一点,我们在给图片设置尺寸时,是不需要写单位的,实际上单位就是独立像素。

假设有两个设备,它们的独立像素相同,都是360*640,那么我有一张图片,设置宽度为180,在这两个设备上都是占了一半屏幕宽。而如果有一个pad它的独立像素是768*1024,我们仍然希望它占一半屏幕的话,就需要把宽度设置为768*0.5=384了。例如对于背景图片,显然需要在任何设备上都占满屏幕,所以给它设置尺寸直接就是设备独立像素的值,也就是Dimension.get(“window”)得到的值。有的时候我们不希望随着屏幕变,例如那张图片仍然设置宽度为180,那么它在pad上宽度只占了23.4%。所以我们可以得知,给图片设置尺寸时,只决定于它在不同的独立像素屏幕上,需要显示成什么效果。最简单的方案是两种,要么设为固定值,要么跟屏幕独立像素成比例。否则就根据不同的屏幕来细分了。

那么这个像素密度拿来做什么用呢?

仍然说那两个设备,它们独立像素都是360*640,A设备像素密度为1,B设备像素密度为3,很容易得知A设备物理像素为360*640,而B设备物理像素为1080*1920。我有一张图片,美术给的尺寸是360*360,现在我给它设的尺寸宽度为180*180,根据上面所说,在这两个设备上图片都占屏幕一半宽,但A设备屏幕一半的物理像素是180,对于图片物理像素宽度360来说,缩小了一半。B设备屏幕一半的物理像素是540,对于图片物理像素宽度360来说,放大了1.5倍。不论放大还是缩小,都会导致图片显示模糊。如果要达到最好的显示效果,就应该给A设备提供180*180尺寸的图片,给B设备提供540*540尺寸的图片,这就是像素密度的作用。

是否要根据不同屏幕提供多套素材资源,取决于项目要求。我们在实际项目中可以使用pixelRation接口来实现物理像素和独立像素之间数值的转换,只要记住物理像素=独立像素*像素密度这个公式即可。

Inhalte