Android Res資源適配詳解
由於裝置的多樣性,Android 系統會檢測當前裝置配置,併為應用載入合適(最匹配)的資源。下面根據經驗結合官方api,詳細說下系統適配的規則。
一、10種資源。在 res中以 <resources_name>-<config_qualifier> 形式命名目錄。Android系統一共為應用提供了10類資源目錄(即resources_name),如下表:
目錄 |
資源型別 |
animator/ |
用於定義屬性動畫的 XML 檔案 |
anim/ |
定義漸變動畫的 XML 檔案 |
color/ |
用於定義顏色狀態列表 |
drawable/ |
點陣圖檔案(.png、.9.png、 |
mipmap/ |
適用於不同啟動器圖示密度的 mipmap/ 資料夾管理啟動器圖示的詳細資訊。 |
layout/ |
用於定義使用者介面佈局。 |
menu/ |
用於定義應用選單(如選項選單、上下文選單或子選單)的 。 |
raw/ |
要以原始形式儲存的任意檔案(2.3版本要求1M)。 |
values/ |
包含字串、整型數和顏色等簡單值的 |
xml/ |
可以在執行時通過呼叫 Resources.getXML() 讀取的任意 XML 檔案 |
在IDE中如下圖:
開發者需要根據不同的資原始檔,放入對應的資料夾或者目錄下,這裡提下幾個目錄:
1.
2.Color通常防止顏色集合,這個跟value下面的顏色值要區分開來,value裡面的color檔案存放的是具體的顏色值,例如:
而color/防止的是顏色的狀態列表,set集合
3.Raw裡面,放置不需要編譯成二進位制的檔案,與assets目錄的區別就是,單個檔案大小有約1m的限制,assets單個檔案允許的大小要比raw大。另外,raw裡面可以通過resource獲取,assets裡面的檔案,只能通過assetmanager讀取。
二、18種資源限定符。系統給app提供了上述10種resources_name後,還給大多數的資源,提供了18種限定符(config_qualifier)的支援,如下表:
優先順序 |
配置 |
限定符值 |
1 |
MCC |
移動國家程式碼,示例:mcc310、mcc310-mnc004、mcc208-mnc00等等 |
2 |
語言和區域 |
語言程式碼定義,示例:en、fr、en-rUS、fr-rFR、fr-rCA等等 |
3 |
佈局方向(api-17) |
應用的佈局方向,ldrtl 是指“佈局方向從右到左”。ldltr 是指“佈局方向從左到右”,這是預設的隱式值。 |
4 |
smallestWidth(api-13) |
螢幕的基本尺寸,由可用螢幕區域的最小尺寸指定。sw<N>dp示例:sw320dp、sw600dp、sw720dp等等 |
5 |
可用寬度 |
指定資源應該使用的最小可用螢幕寬度。w<N>dp示例:w720dp、w1024dp等等 |
6 |
可用高度 |
指定資源應該使用的最小可用螢幕高度。h<N>dp示例:h720dp、h1024dp等等 |
7 |
螢幕尺寸 |
small(320x426 dp)、normal(320x470 dp)、large(480x640 dp)、xlarge(720x960 dp) |
8 |
螢幕縱橫比 |
long(寬屏)、notlong(非寬屏) |
9 |
螢幕方向 |
port、land |
10 |
UI 模式 |
car(車載手機座)、desk、television、appliancewatch |
11 |
夜間模式 |
Night、notnight |
12 |
螢幕畫素密度 (dpi) |
ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi、nodpi、tvdpi |
13 |
觸控式螢幕型別 |
notouch:裝置沒有觸控式螢幕、finger |
14 |
鍵盤可用性 |
keysexposed:裝置具有可用的鍵盤、keyshidden、keyssoft |
15 |
主要文字輸入法 |
nokeys:裝置沒有用於文字輸入的硬按鍵、qwerty、12key |
16 |
導航鍵可用性 |
Navexposed、navhidden |
17 |
主要非觸控導航方法 |
Nonav、dpad、trackball、wheel |
18 |
平臺版本(API 級別) |
示例:v3、v4、v7 等等 |
需要注意的是,相當一部分的資源限定符是在不同的系統api上逐步增加的,不要以為所有的系統版本都支援18中限定符,因此當你確定要新增該限定符時,應該要確保當前的api版本是否支援。
三、適配的原則:
當您請求要為其提供備用資源的資源時,Android 會根據當前的裝置配置選擇要在執行時使用的備用資源。規則如下:
1.淘汰與裝置配置衝突的資原始檔。
2.選擇上述限定符表中優先順序最高的限定符。(先從 MCC 開始,然後下移。)
3.是否有資源目錄包括此限定符?
4.淘汰不含此限定符的資源目錄。
5.返回並重復第 2 步、第 3 步和第 4 步,直到只剩下一個目錄為止。
過程如下圖:
四、一個sample:
上面說了規則,下面舉個例子,假設裝置配置如下:
區域設定 = en-GB
螢幕方向 = port
螢幕畫素密度 = hdpi
觸控式螢幕型別 = notouch
主要文字輸入法 = 12key
有下面的資源去適配:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-land-hdpi/
drawable-port-notouch-12key/
1.根據四中的原則,第一步,淘汰與裝置配置衝突的資原始檔,因此下面的資源被淘汰:
drawable-fr-rCA/
drawable-land-hdpi/
2.第二、三步,選擇限定符表中優先順序最高的限定符,從mcc往下看,第一個mcc沒有,第二個en,資源裡面有目錄包含有。
3.第四步,淘汰不含此限定符(en)的資源目錄:
drawable/
drawable-port-notouch-12key/
4.第五步,重複上面的流程,port比notouch優先順序高,所以淘汰
drawable/
drawable-en-notouch-12key/
5.最後,剩下
drawable-en-port/
這個就是系統的適配原則。
五、再說下drawable圖片的適配,android系統是如何適配不同密度的手機呢,如下圖:
如果要適配6中密度的手機,難道要放6套圖片到各自的限定符目錄中嗎,這顯然是不可能的,大小無法接受,通常情況是針對高螢幕密度(240dpi,一般對應解析度為480x800)的手機,設計一套滿足視覺效果的圖片基本就能滿足要求。
那麼對於不落在這個密度範圍內的手機,系統是如何適配的呢?
原則也很簡單,系統會優先查詢比當前密度更大的目錄,看是否存在對應的圖片,如手機為hdpi,若app裡面hdpi目錄下,沒有圖片,系統會依次查詢xhdpi、xxhdpi、xxxhdpi的檔案,如果仍然沒有,再查詢比他低密度的目錄。
這樣查詢的好處在於,系統將使用比當前密度更大的圖片來顯示,防止圖片拉伸變成鋸齒。
附官方api說明:https://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch