come on!让我们用几分钟把android的drawable目录图片加载机制说清楚吧

我们刚接触android的时候,也许就已经多多少少了解到了android系统会在多个drawable目录下,动态加载最适合的图片,也就是图片资源加载机制,可是,它选择某张图片的原因是什么呢?为什么我的图片是100x100分辨率,可是加载出来的图片为什么分辨率会发生变化呢?接下来我们就来分析一下。
首先,我们在项目中,会创建多个drawable适配目录,在这里需要注意下,drawable等同于drawable-mdpi,如果你在drawable和drawable-mdpi目录下放置相同的两份图片,而你这么做的目的是为适配的话,那你就太那什么了。
这里写图片描述
有的童鞋也许会问,那google官方文档上说的mipmap目录呢?
这里写图片描述
官方文档上建议将应用图标放在这些目录下,理由是:bulabulabula…反正我一建项目,就会不由自主的,马上,立刻,把这几个目录删掉,就因为一个应用图标就要创建好几个目录?就算是放在mipmap目录下会优化加载,可我放在drawable下,显示也不差啊!好吧,承认这个解释有点简单粗暴了。
接下来我们看看这几个drawable目录分别对应哪些屏幕吧。(dpi属性)
这里写图片描述
没错,我们的drawable目录就是官方标准设备匹配的目录。
应用装在一台设备上,当它要加载资源图片时,它会到符合当前设备屏幕dpi的那个drawable目录下去寻找图片,找着了,perfect。要是没找着呢?这时系统是向高dpi目录找呢,还是向低dpi目录找呢?这时它的匹配规则是这样的:
先向上到稍高于当前屏幕dpi的目录下寻找,如果没有找着,到更高点的的目录下寻找,如果到头了还没有找着,那么它会到稍低于当前屏幕dpi的目录下,如果没找着,到更低点的目录下寻找。
有人童靴可能会问,要是都没找着呢?那我就想问你了,你的项目是怎么通过编译的呢?
到这,就能引出这个公式了:

实际加载图片的分辨率=(系统匹配到的最佳目录dpi / 屏幕dpi) * 图片本身的分辨率

到这,再去想开篇提出的那些问题,是不是有种豁然开朗的感觉呢?
一般,相对于小分辨图片,大分辨率图片的放置位置更需额外注意,
试想,我这有张1024x800(32bit)的图片,我将它放置在drawable目录下,然后应用运行在屏幕密度为480dpi的设备上,这张图片在加载时,系统需为其分配1024*800*4/1024/1024*3≈10MB的内存空间,很容易出现OOM,所以,在不影响低dpi设备的显示质量的情况下,大图片放置的目录的dpi越高,越保险,建议放在drawable-xhdpi目录下(个人是这么认为的)。

猜你喜欢

转载自blog.csdn.net/qq_15692039/article/details/61718957
今日推荐