1. 程式人生 > >Android Res資源適配詳解

Android Res資源適配詳解

由於裝置的多樣性,Android 系統會檢測當前裝置配置,併為應用載入合適(最匹配)的資源。下面根據經驗結合官方api,詳細說下系統適配的規則。

一、10種資源。在 res中以 <resources_name>-<config_qualifier> 形式命名目錄。Android系統一共為應用提供了10類資源目錄(即resources_name),如下表:

目錄

資源型別

animator/

用於定義屬性動畫的 XML 檔案

anim/

定義漸變動畫的 XML 檔案

color/

用於定義顏色狀態列表

drawable/

點陣圖檔案(.png.9.png

.jpg.gif)、狀態列表、形狀...

mipmap/

適用於不同啟動器圖示密度的 mipmap/ 資料夾管理啟動器圖示的詳細資訊。

layout/

用於定義使用者介面佈局。

menu/

用於定義應用選單(如選項選單、上下文選單或子選單)的 。

raw/

要以原始形式儲存的任意檔案(2.3版本要求1M)。

values/

包含字串、整型數和顏色等簡單值的 

xml/

可以在執行時通過呼叫 Resources.getXML() 讀取的任意 XML 檔案

在IDE中如下圖:

 

開發者需要根據不同的資原始檔,放入對應的資料夾或者目錄下,這裡提下幾個目錄:

1.

animator和anim一般都用來放動畫,官方文件中說animator放屬性動畫,但其實動畫統一放在anim也是沒問題的,如果app動畫不多,統一放在一個目錄還便於管理。

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