Android是如何根據限定符,來尋找合適的資源檔的?,android資源檔
轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992
本文主要介紹了當我們使用限定符修飾我們的資源檔夾,例如drawable-en-ldpi時,Android系統是根據什麼規則對這些檔案夾進行篩選和選擇的。
本文不是嚴肅翻譯,想查看原文的請戳 Providing Resources
我們都知道,當我們使用限定符修飾資源檔夾,比如說drawable或者是values的時候,Android系統會根據運行時所在的裝置屬性和配置,來動態選擇最合適的資源檔,那麼,這個過程具體是如何進行的呢?我們下面就以drawable檔案夾為例,詳細的介紹這個選擇的過程和注意事項。
現在我們要假設這樣一種情況,我們在下面這些檔案夾裡面都包含同一張圖片的不同版本:
- drawable/
- drawable-en/
- drawable-fr-rCA/
- drawable-en-port/
- drawable-en-notouch-12key/
- drawable-port-ldpi/
- drawable-port-notouch-12key/
並且假設我們的運行時裝置配置如下:
- Locale = en-GB
- Screen orientation = port
- Screen pixel density = hdpi
- Touchscreen type = notouch
- Primary text input method = 12key
通過比較裝置配置和上面這些可用的限定符修飾的這些drawable檔案夾,最終Android裝置選擇了來自drawable-en-port檔案夾的的圖片。
系統是根據下面的邏輯來判斷為什麼要選擇這個檔案夾裡面的圖片的:
翻譯版本:
Created with Raphaël 2.1.21.排除和裝置配置相矛盾的限定符2.按照限定符表的優先順序選擇下一個限定符3.是否有資源檔夾使用了這個限定符?4.排除不包含這個限定符的檔案夾(應該還有一個到第2步的迴環,畫不出來)yesno
注意:螢幕的像素密度修飾符,不會因為與裝置配置不一樣而被排除掉,即使我們的裝置現在是hdpi,但是drawable-port-ldpi/也不會因為限定符的原因被排除,因為在這個階段,所有的螢幕密度都被考慮進行適配。更多資訊請參考Support Multiple Screen。
2. 按照表格中的順序,選擇下一個高優先順序的修飾限定符。(從MCC開始,一直往下)
限定符的順序如下所示,從上到下,優先順序遞減。因為好多很少用到,所以這是一部分,更加詳細的請參考原文。
| 配置 |
限定符取值樣本 |
| MCC MNC |
mcc310 |
| 語言 |
en-rUS |
| 布局方向 |
ldrtl ldltr |
| 最小寬度限定符 |
sw320dp |
| 可獲得寬度 |
w720dp |
| 可獲得高度 |
h720dp |
| 螢幕尺寸 |
large |
| 螢幕方面 |
long notlong |
| 螢幕方向 |
port land |
| UI模式 |
car appliance watch |
| 夜晚模式 |
night notnight |
| 螢幕像素密度 |
mdpi nodpi |
| 觸控螢幕幕類型 |
notouch finger |
3. 有沒有檔案夾包含這些限定符?
- 如果是NO,就返回第二步,然後看下一個限定符。(在這個例子裡面,在找到語言限定符之前回答都是NO)
- 如果是YES,繼續第四步。
4. 排除不包含這個限定符的資源檔夾。在這個例子裡面,系統會排除所有不包含語言限定符的資源檔夾。
- drawable/
- drawable-en/
- drawable-en-port/
- drawable-en-notouch-12key/
- drawable-port-ldpi/
- drawable-port-notouch-12key/
警告:如果上面提到的限定符是螢幕密度,那麼系統就會選擇最接近裝置螢幕密度的資源檔夾。通常來說,Android更傾向於縮小一個比較大的圖片而不是放大一個比較小的圖片。
5. 返回上去,並且重複2,3,4步,一直到只有一個檔案夾剩下。在這個樣本中,螢幕方向是下一個限定符,所以說,不指定螢幕方向限定符的檔案夾就被排除了。
- drawable-en/
- drawable-en-port/
- drawable-en-notouch-12key/
現在就剩下我們的檔案夾drawable-en-port/了。
雖然在我們請求每個資源檔的時候,這個步驟都會執行,但是系統對一些方面進行了最佳化。一旦我們的裝置配置已知,那麼那些永遠不可能匹配的檔案夾就會被排除出去。舉例來說,如果我們的語言配置是英語,那麼有其他語言限定符的資源檔夾就被系統排除出去,不再進行檢查,這樣就可以提高我們的效能。當然,那麼沒有指定語言限定符的資源檔夾還是存在的。
當我們選擇一個基於螢幕尺寸的限定度的時候,如果沒有非常適合的資源檔夾,那麼系統就會選擇比當前螢幕小的資源檔夾。舉例來說,如果我們沒有為large螢幕配置合適的資源檔,那麼系統就會選擇normal螢幕大小的資源。然而,如果當前可選的資源檔夾的螢幕尺寸修飾限定符比現在的螢幕大,那麼我們的系統不會使用這些資源,而是會直接崩潰。舉例來說,如果我們的布局資源只有xlarge限定符,如果我們在normal-size裝置運行,就會直接崩潰。
注意:前面的限定符的優先順序順序比限定符的數量更加重要。舉例來說,在第四部之前,可選的資源檔夾裡面drawable-port-notouch-12key可能有三個限定符符合現在的裝置,而drawable-en只有一個限定符符合,但是因為語言限定符的優先順序比較高,所以drawable-port-notouch-12key檔案夾就直接被排除了。