drawable使用順序

轉自:http://blog.csdn.net/lvwenbo0107/article/details/51655161


1.mipmap & drawable

The mipmap folders are for placing your app icons inonly. Any other drawable assets you use should be placed in the relevant drawable folders as before. 
mipmap文件夾只放應用圖標(HomeScreen啓動圖標)其他需要使用的drawable資源象之前一樣放到對應的drawable文件夾

爲什麼?1.好找。。2.將icon放置在mipmap文件夾還可以讓我們程序的launcher圖標自動擁有跨設備密度展示的能力

比如說一臺屏幕密度是xxhdpi的設備可以自動加載mipmap-xxxhdpi下的icon來作爲應用程序的launcher圖標,這樣圖標看上去就會更加細膩。 關於建議使用mipmap的原文可以參閱這篇文章:Getting Your Apps Ready for Nexus 6 and Nexus 9, 當然你還是要科學上網的。 

除此之外,對於每種密度下的icon應該設計成什麼尺寸其實Android也是給出了最佳建議,icon的尺寸最好不要隨意設計,因爲過低的分辨率會造成圖標模糊,而過高的分辨率只會徒增APK大小。建議尺寸如下表所示:

密度 建議尺寸
mipmap-mdpi 48 * 48
mipmap-hdpi 72 * 72
mipmap-xhdpi 96 * 96
mipmap-xxhdpi 144 * 144
mipmap-xxxhdpi 192 * 192

然後我們引用mipmap的方式和之前引用drawable的方式是完全一致的,在資源中就使用@mipmap/res_id,在代碼就使用R.mipmap.res_id。比如AndroidManifest.xml中就是這樣引用ic_launcher圖標的:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@mipmap/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:supportsRtl="true"  
  6.     android:theme="@style/AppTheme">  
  7.     <activity android:name=".MainActivity">  
  8.         <intent-filter>  
  9.             <action android:name="android.intent.action.MAIN"/>  
  10.             <category android:name="android.intent.category.LAUNCHER"/>  
  11.         </intent-filter>  
  12.     </activity>  
  13. </application>  

2.獲取手機DPI的方法

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. float xdpi = getResources().getDisplayMetrics().xdpi;  
  2. float ydpi = getResources().getDisplayMetrics().ydpi;  

在我的手機上這兩個值都約等於403。那麼403又代表着什麼意思呢?我們直接參考下面這個表格就知道了:

dpi範圍 密度
0dpi ~ 120dpi ldpi
120dpi ~ 160dpi mdpi
160dpi ~ 240dpi hdpi
240dpi ~ 320dpi xhdpi
320dpi ~ 480dpi xxhdpi
480dpi ~ 640dpi xxxhdpi

從表中可以看出,403dpi是處於320dpi到480dpi之間的,因此屬於xxhdpi的範圍。 
圖片放好了之後,下面我在佈局文件中引用這張圖片,如下所示:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.    >  
  7.   
  8.     <ImageView  
  9.         android:id="@+id/image"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:src="@drawable/android_logo"  
  13.         />  
  14.   
  15. </LinearLayout>  

3.同一張圖片放在不同文件夾下有什麼不同?Android默認的資源檢索順序?

比如真機分辨率是xxhdpi,那麼如果將圖片放在xhdpi下圖片會被放大,而將圖片放在xxxhdpi中圖片會被縮小。

drawable-xxhdpi文件夾下有這張圖就會優先被使用,在這種情況下,圖片是不會被縮放的。但是,如果drawable-xxhdpi文件夾下沒有這張圖時, 系統就會自動去其它文件夾下找這張圖了,優先會去更高密度的文件夾下找這張圖片,我們當前的場景就是drawable-xxxhdpi文件夾,然後發現這裏也沒有android_logo這張圖,接下來會嘗試再找更高密度的文件夾,發現沒有更高密度的了,這個時候會去drawable-nodpi文件夾找這張圖,發現也沒有,那麼就會去更低密度的文件夾下面找,依次是drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。 
總體匹配規則就是這樣,那麼比如說現在終於在drawable-mdpi文件夾下面找到android_logo這張圖了,但是系統會認爲你這張圖是專門爲低密度的設備所設計的,如果直接將這張圖在當前的高密度設備上使用就有可能會出現像素過低的情況,於是系統自動幫我們做了這樣一個放大操作。 
那麼同樣的道理,如果系統是在drawable-xxxhdpi文件夾下面找到這張圖的話,它會認爲這張圖是爲更高密度的設備所設計的,如果直接將這張圖在當前設備上使用就有可能會出現像素過高的情況,於是會自動幫我們做一個縮小的操作。

drawable-nodpi文件夾,這個文件夾是一個密度無關的文件夾,放在這裏的圖片系統就不會對它進行自動縮放,原圖片是多大就會實際展示多大。但是要注意一個加載的順序,drawable-nodpi文件夾是在匹配密度文件夾和更高密度文件夾都找不到的情況下才會去這裏查找圖片的,因此放在drawable-nodpi文件夾裏的圖片通常情況下不建議再放到別的文件夾裏面。 

4.那麼縮放比例是怎樣的?

還是看一下剛纔的 dpi範圍-密度 表格:

dpi範圍 密度
0dpi ~ 120dpi ldpi
120dpi ~ 160dpi mdpi
160dpi ~ 240dpi hdpi
240dpi ~ 320dpi xhdpi
320dpi ~ 480dpi xxhdpi
480dpi ~ 640dpi xxxhdpi

可以看到,每一種密度的dpi範圍都有一個最大值,這個最大值之間的比例就是圖片會被系統自動放大的比例。 面我們來開始分析,mdpi密度的最高dpi值是160,而xxhdpi密度的最高dpi值是480,因此是一個3倍的關係,那麼我們就可以猜測,放到drawable-mdpi文件夾下的圖片在xxhdpi密度的設備上顯示會被放大3倍。對應到android_logo這張圖,原始像素是270*480,放大3倍之後就應該是810*1440像素。

5.圖片放錯容易產生的問題是?

如果將一張圖片放在低密度文件夾下,那麼在高密度設備上顯示圖片時就會被自動放大,而如果將一張圖片放在高密度文件夾下,那麼在低密度設備上顯示圖片時就會被自動縮小。那我們可以通過成本的方式來評估一下,一張原圖片被縮小了之後顯示其實並沒有什麼副作用,但是一張原圖片被放大了之後顯示就意味着要佔用更多的內存了。因爲圖片被放大了,像素點也就變多了,而每個像素點都是要佔用內存的。 
我們仍然可以通過例子來直觀地體會一下,首先將android_logo.png圖片移動到drawable-xxhdpi目錄下,運行程序後我們通過Android Monitor來觀察程序內存使用情況: 


可以看到,程序所佔用的內存大概穩定在19.45M左右。然後將android_logo.png圖片移動到drawable-mdpi目錄下,重新運行程序,結果如下圖所示: 

現在漲到23.40M了,佔用內存明顯增加了。如果你將圖片移動到drawable-ldpi目錄下,你會發現佔用內存會更高。 

4.如果只有一套切圖放在哪個文件夾下?

我相信有不少比較有經驗的Android程序員可能都遇到過這個情況,就是當你的項目變得越來越大,有的時候加載一張drawable-hdpi下的圖片,程序就直接OOM崩掉了,但如果將這張圖放到drawable-xhdpi或drawable-xxhdpi下就不會崩掉,其實就是這個道理。 
那麼經過上面一系列的分析,答案自然也就出來了,圖片資源應該儘量放在高密度文件夾下,這樣可以節省圖片的內存開支,而UI在設計圖片的時候也應該儘量面向高密度屏幕的設備來進行設計。就目前來講,最佳放置圖片資源的文件夾就是drawable-xxhdpi。那麼有的朋友可能會問了,不是還有更高密度的drawable-xxxhdpi嗎?幹嗎不放在這裏?這是因爲,市面上480dpi到640dpi的設備實在是太少了,如果針對這種級別的屏幕密度來設計圖片,圖片在不縮放的情況下本身就已經很大了,基本也起不到節省內存開支的作用了。

總結郭霖博客http://blog.csdn.net/guolin_blog/article/details/50727753 


-------------------------------我的測驗

經過驗證,這篇博客所說的順序是對的。另外,drawable是排在最後一個順序的。

drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi>drawable


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章