目录
drawable目录和mipmap目录基础
AndroidStudio上创建的新项目中会默认包含drawable文件夹和一些mipmap的文件夹。如下图:
我们还可以自己创建一些drawable和mipmap目录:如下图:
创建mipmap文件夹
创建drawable文件夹:
我们可以看到它们创建的类型都是一样的。那么mipmap目录和drawable目录有什么区别呢?
mipmap 技术是Android 在 API level 17 加入了的,是用来提高图片渲染的速度和质量。mipmap 和 drawable 的目录区别就是mipmap技术是否开启的区别。mipmap 目录下的图片默认为 开启,drawable 默认为关闭。所以这里就可以看出mipmap目录用来存放应用图标会更好一些。
上面看到我们可以创建很多个mipmap目录和drawable目录。那么这些目录各自代表的意义是什么呢?我们就需要了解Android使用资源id加载图片资的规则。
Android使用资源id加载图片资的规则
由于Android 设备具有多种屏幕密度,为了让这些设备获得良好的图形质量和性能。我们就需要提供各个密度(低密度、中密度、高密度和超高密度)的图片资源。也就是如果在xhdpi 设备上要显示一张 200x200 的图像,我们就还需要增加hdpi设备(150x150)、mdpi 设备(100x100)和 ldpi 设备 (75x75)的同一资源图片。然后将这些图片文件置于 res/ 下的相应drawable或者mipmap目录中,系统将自动根据运行应用的设备的屏幕密度选取正确的文件;这样设备才不会出现显示失真的问题。下面就是文件后缀名对应的密度标识。
- ldpi 0.75
- mdpi 1 (安卓里面以160为标准)
- hdpi 1.5
- xhdpi 2.0
- xxhdpi 3.0
- xxxhdpi 4.0
drawable和mipmap目录就是用来存放这些图片的文件夹。Android系统会去加载里面的图片。那么我们就会想Android系统是怎么判断,应该去加载哪一个drawable或者mipmap目录的呢?同时我们应该把图片放入到哪一个目录下呢?
当我们使用资源id去加载图片时,Android系统会按照规则去匹配最适合的图片。
比如我应用中需要加载一张home_logo图片。此时我的手机屏幕密度是xxhdpi,那么mipmap-xxhdpi文件夹下的图片就是最适合的图片。如果mipmap-xxhdpi文件夹下有home_logo这张图,它就会优先被使用,并且是不会被缩放的。
但是,如果mipmap-xxhdpi文件夹下没有home_logo这张图时, 系统就会去更高密度的文件夹下找这张图片,也就是mipmap-xxxhdpi文件夹,如果高密度的文件夹没有找到图片资源,就会去低密度的文件夹下面找,以此类推:依次是mipmap-xhdpi -> mipmap-hdpi -> mipmap-mdpi -> mipmap-ldpi。找到图片资源进行缩放处理。
图片如果进行了缩放处理就会改变它的分辨率,就会影响到它在系统中的内存占用。高密度目录下的图片会缩小,低密度目录的图片会变大。所以图片一定要放入到正确的密度目录中去。
使用总结
使用需要注意几点:
- mipmap和drawable目录加载资源路径上有一定的差异,R.drawable.xxx或者R.mipmap.xxx。
- 在Launcher中显示的应用图标一定要放入到mipmap目录下,Launcher会自动加载更加合适的密度的资源。
- 如果你的应用使用人数较多,建议在所有目录都放一套图,这样就会避免图片因为缩放出现失真。
- 如果你的应用只使用一份切图,那尽量让UI提供一份最高分辨率的切图并且放在最高密度的文件夹中。因为同一张图片在高密度的文件夹里比放在低密度的文件夹里所占用的内存要小的多。