Android UI適配總結(一)尋找最佳匹配資源


Android UI適配總結(一)尋找最佳匹配資源

系統是怎么確定最佳資源的?

  • 獲取手機當前的基本配置信息(語言,橫豎屏,屏幕密度,屏幕尺寸等等)
  • 根據這些配置信息,排除apk包中與這些配置信息相矛盾的資源目錄,假設系統語言是cn,那么所有的其他語言的目錄都會被排除掉,注意系統並不會根據一個dpi的沖突而排除掉含有其他dpi的目錄,dpi這個qualifier非常特殊
  • 按照qualifirer的優先級,依次拿出配置信息中優先級最高的qualifier,去資源目錄中尋找包含這個qualifer的目錄,如果有,排除掉其他目錄,根據配置中下一個優先級的qualifier繼續匹配,如果沒有,接着去拿下一個優先級的qualifier,繼續尋找和排除,直到找到最合適的目錄。

實例

假設我們放置同樣名稱的圖片在如下目錄

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

匹配過程

首先qualifier的優先級如下,en-GB, port,hdpi,notouch,12key

* 根據en-GB,port,hdpi,notouch,12key這些配置信息,首先排除掉**drawble-fr-rCA目錄,因為fr和en沖突
* 根據第一優先級的en-GB,找到如下三個目錄,drawable-en/,drawable-en-port/,drawable-en-notouch-12key/,排除掉目錄drawable/,drawable-port-ldpi/,drawable-port-notouch-12key/
* 接着獲取下一個優先級的qualifier,port,找到了目drawable-en-port/,排除掉其他目錄,就剩這一個了,那么就是這個了。

重點

  • 雖然程序會頻繁的獲取資源文件,但是那些與當前配置信息相矛盾的目錄會被永久排除掉,不會每次都去檢查

  • 假設系統根據screen size去尋找最匹配資源的時候,如果沒有找到完全匹配的資源,系統會選擇比當前配置小一點的screen size作為匹配,(例如一個large的屏幕會選擇normal資源,如果找不到large資源的話)假設沒有的話,只有xlarge的資源,系統不會選擇使用這個資源,這個時候就會發生找不到資源的異常了。

  • 資源限定符的優先級比匹配的qualifier多少更重要。例如在上面的例子中,drawable-en-notouch-12key/似乎更加匹配,但是port的優先級更高。

問題

假設匹配了最佳圖片目錄,但是發現目錄里沒有自己想要的圖片會怎么樣?

  • 如果是mdpi中沒有圖片,可以去選擇hdpi的目錄里找尋圖片,然后縮放

  • 如果是large種沒有圖片,可以去normal中找尋圖片

  • 如果layout-port中沒有布局文件,就去layout中找尋布局文件

  • 如果values-cn-hdpi下沒有dimen的話,有待研究

  • 假設當前手機屏幕是hdpi,res目錄下含有mdpi,hdpi,xhdpi,xxhdpi,但是hdpi目錄下沒有需要的圖片,其他的目錄下都包含,那么當前手機會選擇哪個圖片呢?
    我的猜測是xxhdpi,因為xxhdpi(3)與hdpi(1.5)的比例正好為2,比從xhdpi(2)縮放到hdpi(1.5)更簡單,但是經過測試發現手機加載的是xhdpi目錄下的圖片,所以我推測系統的邏輯是:首先是高dpi原則,也就是如果當前dpi下沒有,那么就從更高dpi的目錄下開始尋找,也就是xhdpi---》xxhdpi---》mdpi。為什么遵循搞dpi原則呢,因為從放大圖片可能會導致圖片失真,變模糊。

參考文檔

Providing Resources


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM