Android屏幕適配-資源文件夾命名與匹配規則

android工程res目錄下的資源文件夾(drawable,values,layout等)在屏幕適配方面的限定與適配方法。

1、 Res下文件夾命名方式
1. 可用的命名屬性
文檔1中的表格“Table 2. Configuration qualifier names. ”中有說明(表格太大,不方便在此張貼),表格中的"Configuration"項集就是Android全體可用命名屬性集,表格此項的排列順序即是各個屬性的優先級別順序。

2. 命名方法與要求
1) 命名不區分大小寫;
2) 命名形式:資源名-屬性1-屬性2-屬性3-屬性4-屬性5.....
資源名就是資源類型名,包括:drawable, values, layout, anim, raw, menu, color, animator, xml;
屬性1-屬性2-屬性3-屬性4-屬性5.....就是上述的屬性集內的屬性,如:-en-port-hdpi;
注意:各屬性的位置順序必須遵守優先級從高到低排列!否則編譯不過

3. 實例說明
1) 把全部屬性都用上的例子(各屬性是按優先級先後排列出來的)
values-mcc310-en-sw320dp-w720dp-h720dp-large-long-port-car-night-ldpi-notouch-keysexposed-nokeys-navexposed-nonav-v7
2) 上述例子屬性的中文說明
values-mcc310(sim卡運營商)-en(語言)-sw320dp(屏幕最小寬度)-w720dp(屏幕最佳寬度)-h720dp(屏幕最佳高度)-large(屏幕尺寸)-long(屏幕長短邊模式)-port(當前屏幕橫豎屏顯示模式)-car(dock模式)-night(白天或夜晚)-ldpi(屏幕最佳dpi)-notouch(觸摸屏模類型)-keysexposed(鍵盤類型)-nokey(硬按鍵類型)-navexposed(方向鍵是否可用)-nonav(方向鍵類型)-v7(android版本)

2、 定位最佳文件夾
1. 定位算法

providingResource
特殊說明:關於屏幕大小size相關的屬性不在步驟1的過濾清除條件裏(dpi屬性和screen size屬性):
1) 對於dpi屬性系統的選擇方法是"best match"---即如果沒有找到準確的屬性,可以接着尋找最接近的屬性文件夾。例如:我的g7手機,應該是values-hdpi,但如果沒有values-hdpi,則可以找出最接近的文件夾(先找values-xhdpi到values-mdpi到values最後到values-ldpi,注意values在values-ldpi之前先找到,系統認爲values比values-ldpi更接近我的values-hdpi屬性);

2) 對於screen size屬性系統的選擇方法是"向下best match",即如果沒找到準確的屬性,只可以接着在比自身屬性小的文件夾裏找最接近的屬性文件夾。例如:我的g7手機,應該是values-normal,但如果沒有values-normal,則可以找出最接近的文件夾(先找values再到values-small,注意,系統認爲values比values-small更接近我的values-normal屬性,但之後就不會再找values-large與values-xlarge了,因爲是"向下best match",large與xlarge都比normal大)。
2. 實例說明
工程有如下文件夾:
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

1) 清除包含任何與手機配置有衝突的屬性的資源文件夾(藍色字體表現被清除)
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
注意:因爲dpi屬性使用"best match"選擇,所以drawable-port-ldpi/
沒被清除。
2) 選擇文檔1中的表格“Table 2. Configuration qualifier names. ”最高優先級的屬性(MCC最高,然後依次向下選擇)。
3)  有包含上述屬性的文件夾嗎?
如果沒有,跳轉步驟2,選擇下一優先級高的屬性;
如果有,繼續步驟4;
4) 清除不包含此屬性的所有文件夾
drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
5) 重複步驟2和3,直到步驟4中只剩下一個文件夾則返回。例子中,屏幕方向是下一個最高優先級的屬性,所以可以清除兩個文件夾:
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/

最終找到的文件夾就是drawable-en-port/

由上述過程可看出,匹配是看最高優先級別的屬性,而不是一共匹配到的屬性數量,例如:values-en-normal-hdpi的手機,values-en匹配比vaues-normal-hdpi更合適。

3、 備註
1. 文檔1中的表格“Table 2. Configuration qualifier names. ”列出的屬性集並不是一直不變的,有些新屬性是在高級的android version才加入的,系統在識別到此新屬性時會自動加上支持新屬性的android最低版本屬性,例如:xhdpi是android 2.2(sdk[img]/images/smiles/icon_cool.gif" alt="[/img]新加入的,則values-xhdpi系統會自動認爲是values-xhdpi-v8,這樣新屬性一定不會在android舊版本中匹配到了;
2. 對於指定分辨率的屬性(例如:values-hdpi-1024x600,values-hdpi-960x540,values-mdpi-1024x600),指定分辨率屬性並沒出現在官網的匹配屬性集裏,也沒找到對於分辨率屬性的詳細說明,經測試,這個分辨率屬性匹配並不準確,例如Galaxy Nexus(1280x720 ),卻可以匹配到values-hdpi-1024x600,因此希望最好不使用分辨率屬性。

4、 參考文檔
1  :Android資源屏幕適配官方文檔:
http://developer.android.com/guide/topics/resources/providing-resources.html

發佈了71 篇原創文章 · 獲贊 49 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章