轉載請註明出處: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文件夾的的圖片。
系統是根據下面的邏輯來判斷爲什麼要選擇這個文件夾裏面的圖片的:
翻譯版本:
首先排除和設備配置想矛盾的drawable文件夾。因爲drawable-fr-rCA/這個文件夾和語言環境en-GB相矛盾,所以直接就被排除掉了。現在我們的資源文件夾情況如下:
- drawable/
- drawable-en/
drawable-fr-rCA/- drawable-en-port/
- drawable-en-notouch-12key/
- drawable-port-ldpi/
- drawable-port-notouch-12key/
注意:屏幕的像素密度修飾符,不會因爲與設備配置不一樣而被排除掉,即使我們的設備現在是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文件夾就直接被排除了。