Android开发使用mipmap文件夹的正确姿势: px 、dpi 、dp

背景


对于mipmap的使用以前并没有太多的深入追究。开发中,图片的适配几乎没有,一张图片适配所有设备,能用就行,自学时的单独开发是如此,工作后的项目之中也是这样。直到阅读《阿里Android开发规范》后,在mipmap的规范上有所疑惑,于是在好奇心的驱使下进行了相关学习,相去已有半载,前两天又碰到相关问题,故而记录温故一下。


像素(px)与像素密度(dpi)


px即是像素点,dpi表示每一英寸下所存在的px个数。px与dpi之间的换算公式为:

像素密度=√{(长度像素数^2+宽度像素数^2)}/ 屏幕尺寸

注:屏幕尺寸是5.2 寸、 6.5 寸等都是指屏幕对角尺寸

例如:小米 mix2 ,分辨率是 1080 x 2160, 屏幕尺寸是 5.99 英寸,那么按照上述算法就是 1080 平方加上 2160 平方再开平方等于 2414.95,然后 2414.95 / 5.99 = 403 dpi


dpi、px与dp的关系


Android机型品种繁多,屏幕大小也是千差万别,为了适配这些尺寸,我们使用dp进行适配,以dp为单位的界面元素,在显示时便根据屏幕尺寸的大小,适当调整界面中各个元素的大小。

规定dpi、px、dp的计算公式为:px = dp * (dpi / 160);

即:规定,1个dp的长度等于dpi为160的屏幕上1个像素所具有的长度。10dp在160dpi的设备上需要10个像素显示,在320dpi的设备上则需要20个像素显示。


dp与mipmap的合理配合


从上述可知,当我们设置一个``的宽度为32dp时,则在240dpi的设备上填充使用的图片宽度为48px,在320dpi的设备上则需要宽度为64px的图片进行填充,按比例依次类推。然而,实际在图片填充的过程我们不可能为每一款设备都给一张完全合乎比例的图片,设备种类太多太杂,因此在Android中采取了近似取值的办法,根据dpi的不同将设备分为:ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi,规则如下:

Android开发使用mipmap文件夹的正确姿势: px 、dpi 、dp_第1张图片

如表中所示,规定240dpi的设备为hdpi型,此时的1dp等于1.5px,需要36px*36px大小的图片来填充24dp * 24dp的界面元素。那么如果dpi不在上表中呢?此时,程序会在运行时选择加载dpi值离上表最近的一个高dpi等级进行加载,即330dpi的设备上程序会加载xxhdpi中,再来一张图你就明白了。

Android开发使用mipmap文件夹的正确姿势: px 、dpi 、dp_第2张图片

如果最近的高dpi等级对应得目录中没有图片资源文件,程序将自动往更高得dpi等级对于的文件中去寻找,如果还是找不到资源文件,程序再向左(依次降低dpi等级)遍历。

如果不妥善处理图片与dpi目录关系,则可能再低密度设备上导致内存增加,又可能在高密度设备上导致图片显示不够清晰。

你可能感兴趣的:(Android,Android基础)