1. 程式人生 > >come on!讓我們用幾分鐘把android的drawable目錄圖片載入機制說清楚吧

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目錄下(個人是這麼認為的)。