首先本文主要解决以下几个问题:
1.什么是DPI,什么是dp,什么是PX,什么是desity,这些干嘛用?
2.一张图片在安卓中到底占多少内存?
3.为什么安卓app的res目录下要用多个文件夹存放图片,有什么作用?
先聊聊屏幕分辨率相关的知识。
像素:由图像的小方格组成的,这些小方格的色彩数值和位置,决定了图像呈现的样子。
1像素就代表1px。
什么是屏幕尺寸? 屏幕对角线的长度
什么是屏幕分辨率 ? 屏幕分辨率=屏幕的宽有多少个像素*屏幕高有多少个像素。指显示器能显示的像素有多少。
屏幕大概分以下几种分辨率:
1920*1080 =2073600像素,俗称1080p屏幕。
2k屏,屏幕横向像素达到2000以上。主流是2560*1440,还有2048×1536(QXGA)、2560×1600(WQXGA)、2560×1440(Quad HD),也是2k屏家族的。
4K屏,名称来源于其横向解析度约为4000像素.屏幕分2种,有4096×2160和3840*2160。
什么是DPI? 每英寸中的像素数。比如设备分辨率是320*240,屏幕的长2英寸,宽1.5英寸,dpi=320/2=240/1.5=160
什么是density?每平方英寸的像素数。
但是在安卓中定义如下:
在DisplayMetrics类中属性density的值为dpi/160
density=dpi/160
什么是dp?dp是安卓的特有单位,
dp=px/density
dp=px/(dpi/160)
如果dpi=160,那么在这个设备上的1dp=1px
这里展开说一下,其实我们蓝湖上看到的1280*720,单位是dp
而实际的设备有多少PX呢。如果是2K屏幕 一般就是2560*1440 ,因为density=px/dp ,也就是屏幕实际宽度/设计图的宽度,或者屏幕实际高度/设计图高度。
所以density=2560/1280=1440/720=2
来算算4K屏 按照4096*2160算 横向 density = 4096/1280=3.2 纵向density=2160/720=3
大致可以看作 density=3
dp:安卓特殊的一种单位,是实际屏幕分辨率宽或者高/density
安卓的几个文件夹定义:
drawable-ldpi:低分辨率(基本没人用了):
density =0.75 , 分辨率是240*320, dp=px/0.75
drawable-mdpi:中分辨率
density=1 , 分辨率是320*480 ,dp=px/1
drawable-hdpi:高分辨率
density=1.5,分辨率是480*800,dp=px/1.5
drawable-xhdpi:较高分辨率
density=2,分辨率=720*1280,dp=px/2
drawable-xxhdpi:超级高分辨率
density=3 ,分辨率=1080*1920 ,dp=px/3
drawable-xxxhdpi:顶级分辨率
density=4,分辨率=2560*4096 ,dp=px/4
一般都是做法是一套xxhdpi的切图,这样可以向上和向下兼容,节省apk的大小
当然,现在项目需求是2K屏和4K屏,也可以在资源中放2套图,这样,低分辨率的屏幕不用因为拿着高分辨率的图渲染而浪费内存。
如果严格按照需求,只要在drawable-xhdpi(对应2k屏)和drawable-xxhdpi(对应4K屏)放入相应的图片就能达到最好的图片清晰度适配。
我们来计算一下一张图片到底占多少内存
这里要补一些基础知识
1G=1024M=1024*1024k=1024*1024*1024字节(Byte) =1024*1024*1024*8位(bit)
bit代表最基本的0或者1
安卓默认颜色是格式是ARGB_888 :
A代表透明度 ,取值范围是0-255 换算成二进制就是 2的8次方 刚好就是1个byte =8bit
R代表红色red,取值范围0-255,也是相当于一个byte
G代表绿色green,取值范围0-255,相当于一个byte
b代表蓝色blue,取值范围0-255.,相当于一个byte
任何颜色只要通过ARGB这4个元素的组合就能表现出来。
那一个像素需要多少内存呢?
答案是4个byte
那一张100px*100px的图片在 2k屏幕中占多少内存呢?
正常情况下不考虑安卓这边做缩放处理
内存消耗=图片长度*图片宽度*4=40000B≈39.06K
这里要考虑到设别本身的dpi,还有文件存放的目录
一张图片实际在安卓设备中消耗的内存=图片长*图片宽*4*(设备横向的dpi/图片存放文件夹对应的dpi)*(设备纵向dpi/图片存放文件夹对应的dpi)
如下举例说明:
比如 当前设备density=2,也就是dpi=2*160=320,这个图片放在xhdpi中(这个文件夹本身对应dpi=320),
内存消耗的计算公式是 100*100*4*(320/320)*(320/320)≈39.06K
那么这张图片的内存消耗是39.06K
如果当前设备density=3,也就是dpi=3*160=480,这个图片仍然放在xhdpi中(这个文件夹本身对应dpi=320)
内存消耗的计算公式是100*100*4*(480/320)*(480/320)=87.89k
安卓图片资源的寻找规则是按照优先找设备dpi相匹配的图片资源文件夹的资源,如果没有找到,就取更高分辨率文件夹的资源,如果还找不到,就取低分辨率的文件夹资源。
各位看客老爷,如果这篇文章对你有把帮助,请点赞!