dp 为啥可以让不同分辨率不同dpi的屏幕显示相近的效果

505 阅读3分钟

书接上回,这次将dp是怎么将视觉效果看起来一样的,如果这期看的稍微有些吃力,可以先看我的 上一篇文章 👈 这个链接可以点

计算屏幕显示效果

1920×1080 分辨率下,不同dpi的设备,怎么算显示效果相同呢?像素数一样?

NO NO NO,答案: 是尺寸一样了,这很符合直觉,就像在现实世界里一样,你我看同一个东西,尺寸是一样的!

这么神奇?

我举个 栗子 来计算出 dp 是如何让我们的视觉效果达到一致的

你手里的手机dpi440,而平板为213

我们想要计算出实际显示的长度(单位:英寸),就是要计算出它占几个像素,然后除以 dpi 就可以了

计算过程

假设需要显示一个150dp的长度,实际显示长度为

dpi计算方法:dpi=像素数尺寸dpi=\frac{像素数}{尺寸}

dp值转化为像素数:150dp=density×150px150dp=density×150px (density=dpi160)(density=\frac{dpi}{160})

这样我们就算出来了占几个像素

手机150dp的视觉尺寸为:150dp×densitydpi\frac{150dp×density}{dpi}

density=dpi160density=\frac{dpi}{160},所以,视觉尺寸为150160英寸\frac{150}{160}英寸,显然跟dpi根本没关系

所以在默认情况下,我们的手机尺寸dpi并不会影响显示效果,他总会显示相同的大小的尺寸,就跟现实世界一样

这一点很多直觉敏锐的小伙伴肯定在dppx转化的时候就发觉了,1dp=density×1px1dp=density×1px,当dpi变大的时候,也就是单位长度的像素数变多的时候,1dp占的px也越多,dpi变为两倍,一英寸里的像素数也变成两倍,1dp也就变为了原来的两倍像素数,换算过来显示的物理长度并没有变化。

由此可见,忽略掉dpi计算时候的取整,可以说用dp可以完完全全保证显示效果的一致性。

思考:

为啥我们看的很多界面显示效果不一致?

**答案:**那是因为APP为相同控件配置了不同dpi下或者不同分辨率下,不同的宽高等数值

例如:

例子一sw最小宽度 )

values-sw1281dpvalues-sw1537dpvalues-sw1921dpvalues

screenWidth[0,1280]单位dp时,读取values里的数据

screenWidth[1281,1536]单位dp时,读取values-sw1281dp里的数据

screenWidth[1537,1920]单位dp时,读取values-sw1537dp里的数据

screenWidth[1921,∞]单位dp时,读取values-sw1921dp里的数据

例子二( 不同等级dpi

values-ldpi120dpi

values-mdpi160dpi

values-hdpi240dpi

values-xhdpi320dpi

values-xhdpi480dpi

values-nodpi,任何dpi

values-tvdpi,约213dpi

这一部分可以去看官方文档,里面讲的很全面,我补充两点官方文档上不容易看出来的信息

  1. dpi后缀是看物理实际分辨率的,接近那个算哪个

image-20210607150735316.png

这里可以看到物理dpi300,但是我覆盖dpi440,它依旧会读取xhdpi的数据,因为300距离320最近

  1. res的文件夹可以添加的后缀有很多,记不住怎么办

    Android Studio新建的时候可以选择

image-20210607151416421.png

OVER

觉得写的不错,欢迎点赞,评论,分享!