一、资源文件夹之间的关系
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 屏幕尺寸信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)