Android資源文件匹配規則及屏幕適配方案

在運行時,Android系統會根據當前的設備設置自動尋找合適的資源。爲不同的設備提供不同的資源,主要是利用特殊命名的資源文件夾來實現的。

 

資源文件命名:

  • Android工程res目錄下資源文件的命名格式:

資源名-屬性1-屬性2-屬性3-屬性4

  • 資源名的取值有:drawable, values, layout, anim, raw, menu, color, animator等
  • 各屬性的位置順序必須遵守優先級從高到低排列,否則編譯不過。以資源文件values爲例,各屬性按優先級從高到低的排序爲:

values-mcc310-en-sw320dp-w720dp-h720dp-large-long-port-car-night-ldpi-notouch-keysexposed-nokeys-navexposed-nonav-v7

 

屏幕寬度,高度的優先級在dpi之前,但是分辨率(1280x720)的優先級要在dpi之後

  • 屬性說明:

values-mcc310(sim卡運營商)-en(語言)-sw320dp(屏幕最小寬度)-w720dp(屏幕最佳寬度)-h720dp(屏幕最佳高度)-large(屏幕尺寸)-long(屏幕長短邊模式)-port(當前屏幕橫豎屏顯示模式)-car(dock模式)-night(白天或夜晚)-ldpi(屏幕最佳dpi)-notouch(觸摸屏模類型)-keysexposed(鍵盤類型)-nokey(硬按鍵類型)-navexposed(方向鍵是否可用)-nonav(方向鍵類型)-v7(android版本)

 

資源文件匹配

  • 匹配是從最高優先級別的屬性開始,排除跟系統配置不同的資源文件,而不是優先選擇匹配到的屬性數量最多的資源文件,例如:系統配置爲values-en-normal-hdpi的手機,values-en匹配比vaues-normal-hdpi更合適。
  • 對於屬性是屏幕大小(screen size),系統的匹配規則是"向下最佳匹配",即如果找不到能跟當前屏幕匹配的資源,比當前更小的屏幕的資源就會被使用(比如,一個large-size屏幕將會在必要的時候使用normal-size屏幕的資源文件);如果唯一可選的資源比當前的屏幕大,系統不會使用它們並且你的程序會崩潰。
  • 如果屬性是屏幕像素密度dpi(device screen density),Android會選擇最接近屏幕像素密度的一個,匹配規則如下圖,可根據後面的測試結果對比。 (Android比較偏向於將原始的大圖片縮放成 小的圖片)。

  • 如果屬性是分辨率(如480x800),向下讀取與它最爲接近的適配文件(即使向上會找到更爲接近的,也取向下找到的結果).
  • 多屬性混合時,匹配的信息越詳細,優先級越高.假設現有一臺手機的分辨率爲1080x1920(xxhdpi),應用程序包含資源文件:values,values-1080x1920,values-xxhdpi,values-xxhdpi-768x1280,values-hdpi-480x800,values-xxhdpi-1080x1920.讀取時這些資源文件的優先級爲:values-xxhdpi-1080x1920 > values-xxhdpi-768x1280 > values-xxhdpi >values-hdpi-480x800, values-1080x1920 > values.
    values-xxhdpi-768x1280的讀取優先級高於values-xxhdpi是因爲values-xxhdpi-768x1280的分辨率小於1080x1920,符合向下讀取最接近的分辨率,並且其提供的信息相對於values-xxhdpi更加詳細.

 

虛擬機測試結果

  • 如果設備的屏幕密度爲mdpi,當查找資源時,若res下只有ldpi,xhdpi,則會匹配到xhdpi;若res下只有ldpi,xxhdpi,則會匹配到ldpi。即屏幕密度爲mdpi,當找不到確切資源時,應用會試着先向上查找(從默認資源文件開始),若仍匹配不到xhdpi及以下的資源,則從設備屏幕密度向下查找(從ldpi開始);若仍找不到,則從前一次向上查找的結束點(xhdpi)繼續繼續向上查找xxdpi。
  • 如果設備的屏幕密度爲hdpi,當找不到確切資源時,應用會試着向上查找(xhdpi、xxhdpi),若仍匹配不到資源,則從設備屏幕密度向下查找(從mdpi開始,其次是默認資源文件、ldpi).

 

參考《Android資源圖片讀取機制

 

實踐經驗

 

如果項目中存放資源的資源文件夾只有一個,爲values,此時查找資源不會出現問題;在適配ui時,爲了適配低分辨率的手機可能會新增一個資源文件,如values-480x800,存放屏幕分辨率爲480x800的相關資源.假設現有一臺手機的分辨率爲1080x1920(xxhdpi),運行該項目的應用程序,則會發現讀取的資源文件夾爲values-480x800!按照預期我們是希望在values文件加中讀取!這是很常見的問題,解決該問題的方法爲:把values文件夾改爲values-xxhdpi,在values-xxhdpi文件夾中存放默認的資源文件,由於dpi屬性的優先級高於分辨率,所以此時讀取的資源文件夾爲values-xxhdpi,而不是values-480x800.

然而上面的方法仍有問題,假設當前手機的分辨率爲480x800(hdpi),會發現讀取的資源文件夾爲values-xxhdpi,而不是values-480x800!原因還是因爲dpi屬性的優先級高於分辨率,因此應該吧文件夾名稱改爲values-hdpi-480x800.

       總而言之,要適配不同分辨率資源文件夾應該爲 values-xxhdpi 以及 values-hdpi-480x800(分辨率).

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章