关于屏幕适配的dp、dpi、px

关于屏幕适配的dp、dpi、px,第1张

一、资源文件夹之间的关系

Android开发中,UI一般会制作多种素材,根据素材的分辨率大小,放在如下几个文件夹中:

ldpi(120dpi)

mdpi(160dpi)

hdpi(240dpi)

xdpi(320dpi)

xxdpi(480dpi)

xxxdpi(640dpi)

以mdpi(160dpi)为基准

可以看出系数比例关系:075:1:15:2:3:4

二、常规的安卓手机分辨率及其dpi和density的计算

查看一下现在Android Studio自带的模拟器设备:

手机屏幕的dpi和density的计算:

以Nexus5X为例:

密度density:420/160=2625

三、资源文件的加载

很明显420dpi不属于上述文件分类中的任何一个,安卓手机分辨率千奇百怪,因此,上述文件夹不是指定具体的分辨率,而是一个范围,如ldpi(value<120dpi),mdpi(120dpi<value<160dpi),以此类推,420dpi会加载xxdpi中的资源文件

验证一下:

这里有两张

将171×171放入xxdpi中,64×64放入xdpi中,用Nexus5X进行测试,应该加载哪个文件夹中的资源呢?

结果如图:

这个到底是加载的哪个文件夹的呢,加载的是171还是64?我也不知道。那么我调换一下,将171×171放入xdpi中,64×64放入xxdpi中,如果变小了,那么证明,必然加载的是xxdpi文件夹的了。

结果如图:

四、转换公式

dp和px之间的换算:

dp=pxdensity

实际开发过程中,常规用到的转换公式是:

以dp2px为例,这里有一个小细节,根据上面的推导,return的结果应该是 (int) (values density),而结果会+05f再强转,原因是浮点型强转整型过程直接回去除小数部分,+05f相当于四舍五入的过程(小数部分大与05的+05f后会进一位),结果显得更加精确。

最近参考 今日头条算法 ,优化了项目的屏幕适配策略。下面是适配过程中的一些心得,部分内容来源于网络。

举个例子:屏幕分辨率为:19201080,屏幕尺寸为5吋的话,那么dpi为440。

dp就是密度自适应的像素。1dp表示 在dpi为160的设备上的一颗像素

px与dp的换算公式px = dp (dpi / 160),很显然,由于相同分辨率但不同屏幕大小的设备dpi是不同的,导致px和dp的基本不存在一个固定的换算关系,为了方便屏幕适配,Android设置了6个通用的密度,换算px与dp时采取通用密度计算,而非设备实际的密度。

以下为6种通用密度,以及其最小的分辨率

得到上面通用密度之后,我们换算dp与px多了一种简便方式。Android系统用mdpi(160dpi)作为基准,此时1px = 1dp,又有px = dp (dpi / 160),所以我们可以很容易的得到以下换算:

sp在dp的基础上引入了scaleFactor变量,一般用于字号,可在系统设置里调大。

同一张放到以上4个分辨率类型的文件夹里,在页面上呈现的效果如下

实际呈现的算法为: 尺寸 系统density / 文件夹 density

因为尺寸、系统density都是固定的,因此最终尺寸表现为: 放的位置越"low",呈现的尺寸越大

比如 宽度200px,系统 density =3,则宽度

下面是详细的解释

我们知道,不管在布局文件中填写的是什么单位,它最后都会被系统转化为 px。系统的转换算法如下:

可以看到 px = dpdensity 。

横向适配的最终目的:让100dp的宽度,在各个机型上,在屏幕上所占的 比例相同

其核心算法是px = dp density。通过修改density这个变量,我们可以让px和画布标注的px值一致,达到适配的效果。

美工同学提供的画布宽度为 750px(iphone6) ,开发中,我们对这些px标注 除2 得到dp值进行使用。

那么density如何求出呢? 根据系统算法px = dpdensity,反推 density =px/dp

拿横向适配画布, density对于不同分辨率的手机修改后如下:

375是我们拿UI画布横向分辨率750/2得出。

屏幕大小 :指屏幕对角线的长度,通常用“寸”来度量。例如 55寸手机。(1英寸=254厘米)

分辨率 :指手机屏幕的像素点个数,例如720x1280,指宽有720个像素点,高有1280个像素点。

PPI :每英寸像素(Pixels Per Inch)又被称为DPI(Dots Per Inch)。它是有对角线的像素点除以屏幕的大小得到的,通常达到400PPI就算是比较高的屏幕密度了。

Android系统使用mdpi即密度值为160的屏幕作为标准,在这个屏幕上1dp=1px,其他屏幕通过比例换算如下表。

另:density和PPI的关系:density = ppi/160 = dpi/160

px = dp x density = dp x (dpi/160)

以上均为16:9的手机屏幕,18:9的手机主流分辨率为10802160

当控件在对应的文件夹中没有找到,就从高分辨率的文件夹依次向低分辨率的文件夹中寻找

android contextgetResources()getDisplayMetrics()这是获取手机屏幕参数,后面的density就是屏幕的密度,类似分辨率,但不是。看一下这个>

下面的代码即可获取屏幕的尺寸: 在一个Activity的onCreate方法中,编写以下代码:

DisplayMetrics metric = new DisplayMetrics(); getWindowManager()getDefaultDisplay()getMetrics(metric); int width = metricwidthPixels; // 宽度(PX) int height = metricheightPixels; // 高度(PX) float density = metricdensity; // 密度(075 / 10 / 15) int densityDpi = metricdensityDpi; // 密度DPI(120 / 160 / 240)

需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。

所以,需要在工程的AndroidManifestxml文件中,加入supports-screens节点,如下:

这样当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。

屏幕适配好几种,目前主流且成本最低的还是修改系统density的方案。

使用也十分简单,只需要在BaseActivity的onCreate方法中调用setDensity方法即可,注意的是应该在setContentView之前设置

以上就是关于关于屏幕适配的dp、dpi、px全部的内容,包括:关于屏幕适配的dp、dpi、px、android 屏幕适配基础知识、6.1 屏幕尺寸信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9415908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存