Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android是如何根據限定符,來尋找合適的資源文件的?

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

首先排除和設備配置想矛盾的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文件夾就直接被排除了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved