drawable vs mipmap,我的图片该放到哪个文件夹呢?

 

最近进一步看了一些关于drawable和mipmap两种图片文件夹区别的文章,现将一些小知识点整理在一起,以便以后查阅。

我们知道Android Studio项目当中有drawable和mipmap文件夹,都是可以用来放图片的,那么他们有什么区别呢?根据google官方的介绍,google推荐将launcher icon放在mipmap目录中,其他的图片都还是应该放在drawable目录下面的。注意,mipmap对图片进行了很好的优化,只是针对launcher icon的。

这是我在这之前对于这两种文件夹不同掌握的知识点,下面再补充一些自己了解到的。

1、每种密度下的icon应该设计成什么尺寸其实Android也是给出了最佳建议,icon的尺寸最好不要随意设计,因为过低的分辨率会造成图标模糊,而过高的分辨率只会徒增APK大小,建议尺寸如下表所示:

2、drawable和mipmap有什么区别呢?

The mipmap folders are for placing your app icons in only. Any other drawable assets you use should be placed in the relevant drawable folders as before.
mipmap文件夹只放应用图标。其他需要使用的drawable资源象之前一样放到对应的drawable文件夹。

It’s best practice to place your app icons in mipmap- folders (not the drawable- folders) because they are used at resolutions different from the device’s current density.
应用的启动图标最好放到mipmap文件夹(不是drawable文件夹),因为它们用在不同分辨率的设备上。

Note: You should place all launcher icons in the res/mipmap-[density]/ folders, rather than drawable/ folders to ensure launcher apps use the best resolution icon.
注意:你应当将虽有启动图标放到res/mipmap-[density]/文件夹中,而不是drawable/文件夹,来确保启动图片使用最好的分辨率图标。

mipmap文件夹只是用来放置应用程序的icon的,仅此而已,两者并没有什么区别,但是用mipmap系统会在缩放上提供一定的性能优化。此外,平常我们都是把应用程序的icon图标和普通的图片资源一起放到drawable文件夹下的,这样看上去就会比较杂乱,有的时候想从一堆的图片资源里面找icon半天也找不到,而文件一多也就容易出现漏放的情况,但恰恰Android是极度建议我们在每一种分辨率的文件夹下面都放一个相应尺寸的icon的,因此将它们独立出来专门放到mimap文件夹当中就很好地解决了这个问题。

2、图片目录有mdpi,hdip,xhdpi,xxhdpi,xxxhdpi,那么我怎么知道某个特定的手机的图片应该放在哪个目录下面呢?首先,我们要获取到我们屏幕的dpi的值,方法如下:

float xdpi = getResources().getDisplayMetrics().xdpi;
float ydpi = getResources().getDisplayMetrics().ydpi;

好,加入现在我计算出来的这两个值大约是在400左右的话,我们在参考一下如下的一个表格:

从表中可以看出,400dpi是处于320dpi到480dpi之间的,因此属于xxhdpi的范围,因此针对这手机的图片就应当放在xxhdpi里面。

3、drawable文件夹不同分辨率的图片目录这么多, 那么android找图片的顺序又是怎么样的呢?

当我们使用资源id来去引用一张图片时,Android会使用一些规则来去帮我们匹配最适合的图片。什么叫最适合的图片?比如我的手机屏幕密度是xxhdpi,那么drawable-xxhdpi文件夹下的图片就是最适合的图片。因此,当我引用android_logo这张图时,如果drawable-xxhdpi文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的。但是,如果drawable-xxhdpi文件夹下没有这张图时, 系统就会自动去其它文件夹下找这张图了,优先会去更高密度的文件夹下找这张图片,我们当前的场景就是drawable-xxxhdpi文件夹,然后发现这里也没有android_logo这张图,接下来会尝试再找更高密度的文件夹,发现没有更高密度的了,这个时候会去drawable-nodpi文件夹找这张图,发现也没有,那么就会去更低密度的文件夹下面找,依次是drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。

4、同样的一张图片放在drawable的不同分辨率目录下面的话,在手机上显示的时候会有放大或者缩小的情况。

这是什么意思呢?举个例子来说,加入我的手机的dpi是属于xxhdpi,那么我在使用图片的时候,图片都应该放置在xxhdpi目录下面。我们定义一个ImageView,在ImageView控件中指定加载dog.png这张图,并把ImageView控件的宽高都设置成wrap_content,这样图片有多大,我们的控件就会有多大,图片占整个屏幕的大小可以用图片宽高的分辨率除以分辨率的宽高计算出来。

当你将将dog.png这张图依次移动(注意是移动而不是复制)到drawable-xhdpi和drawable-hdpi文件夹下你会发现图片被依次放大,占据屏幕的比例也越大。

当了解到了android寻找drawable目录规则后,我们就可以对这个现象做一个解释:

  • 当我们将图片从xxhdpi移动到hdpi下面后,Android依次取xxxhdip和xhdpi下面照图片,发现都没有找到,最终在drawable-hdpi文件夹下面找到dog.png这张图了,但是系统会认为你这张图是专门为低密度的设备所设计的,如果直接将这张图在当前的高密度设备上使用就有可能会出现像素过低的情况,于是系统自动帮我们做了这样一个放大操作。

  • 同理,如果系统是在drawable-xxxhdpi文件夹下面找到这张图的话,它会认为这张图是为更高密度的设备所设计的,如果直接将这张图在当前设备上使用就有可能会出现像素过高的情况,于是会自动帮我们做一个缩小的操作。

5、drawable-nodpi这个文件夹是干嘛的?

这个文件夹是一个密度无关的文件夹,放在这里的图片系统就不会对它进行自动缩放,原图片是多大就会实际展示多大。但是要注意一个加载的顺序,drawable-nodpi文件夹是在匹配密度文件夹和更高密度文件夹都找不到的情况下才会去这里查找图片的,因此放在drawable-nodpi文件夹里的图片通常情况下不建议再放到别的文件夹里面,具体的可参考第3条当中的图片查找顺序。

6、将同一个图片放置在drawable不同分辨率目录下的缩放倍数是怎么确定的呢?


看上图先说结论:可以看到,每一种密度的dpi范围都有一个最大值,这个最大值之间的比例就是图片会被系统自动放大的比例。

举例来说,mdpi密度的最高dpi值是160,而xxhdpi密度的最高dpi值是480,因此是一个3倍的关系,那么我们就可以猜测,放到drawable-mdpi文件夹下的图片在xxhdpi密度的设备上显示会被放大3倍。对应到android_logo这张图,原始像素是270480,放大3倍之后就应该是8101440像素。

同理,将图片移动到drawable-xxxhdpi目录下。xxxhdpi密度的最高dpi值是640,480是它的0.75倍,那么我们就可以猜测,放到drawable-xxxdpi文件夹下的图片在xxhdpi密度的设备上显示会被缩小至0.75倍。270480的0.75倍应该是202.5360,由于像素不支持小数点,那么四舍五入就应该是203*360像素。

7、如果在平常开发过程当中开发只提供了一套图,那么我们应该放在哪个目录下面呢?
就目前来讲,最佳放置图片资源的文件夹就是drawable-xxhdpi。那么有的朋友可能会问了,不是还有更高密度的drawable-xxxhdpi吗?干吗不放在这里?这是因为,市面上480dpi到640dpi的设备实在是太少了,如果针对这种级别的屏幕密度来设计图片,图片在不缩放的情况下本身就已经很大了,基本也起不到节省内存开支的作用了。

可以这样来分析,如果将一张图片放在低密度文件夹下,那么在高密度设备上显示图片时就会被自动放大,而如果将一张图片放在高密度文件夹下,那么在低密度设备上显示图片时就会被自动缩小。那我们可以通过成本的方式来评估一下,一张原图片被缩小了之后显示其实并没有什么副作用,但是一张原图片被放大了之后显示就意味着要占用更多的内存了。因为图片被放大了,像素点也就变多了,而每个像素点都是要占用内存的。

8、在分析的过程中我们提到了同一张图片放在不同的文件夹下面会占用不同的内存,这个我们怎么查看和验证呢?
我们可以通过Android Device Monitor来查看,如下

本文参考:http://android.jobbole.com/82956/

 转载自:https://www.jianshu.com/p/e02a7c96c87b

发布了6 篇原创文章 · 获赞 15 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/pkorochi/article/details/87162772