Android 系統(tǒng)尋找匹配資源的邏輯

相關單位

我們常用的資源單位有px、dp、sp、dpi,如圖:


dpi && dp && sp

補充

發(fā)現(xiàn)有些視覺同學可能不大清楚開發(fā)要的視覺標注中 dp 和 px 的區(qū)別。這邊說下,
px 是指像素,比如車機的物理尺寸為[1920, 720]px,像素密度為 160dpi,像素密度(dpi)為單位面積的像素數(shù)。
而 dp 是指密度無關像素(開發(fā)在代碼中需要使用到的單位),我們規(guī)定在中密度(mdpi:~160dpi)的屏幕上 1dp = 1px。因此如果某個屏幕的像素密度為 480dpi,那么在這個屏幕上 1dp = 480/160 px = 3px。
但我們車機是 160dpi ,因此其 1dp = 1px。
所以在輸出車機的視覺標注時,直接輸出 [1920, 720]dp 的標注就行。


讓視覺同學理解 px 和 dp

Context

我們知道 Context 提供訪問應用獨有資源的接口,如圖:


Context

但從 android R 之后只能從 Activity 或者 WindowContext 來訪問資源(在多窗口模式下僅這其它 Context 獲取的 Configuration 可能錯誤)。


WindowContext

如需要在主屏幕上添加應用覆蓋的窗口,需要用 Window Context 來 inflate view 和添加 window 到 WindowManager 以便在多窗口模式下也能獲取到正確的資源:

final DisplayManager dm = anyContext.getSystemServer(DisplayManager.class);
final Display primaryDisplay = dm.getDisplay(DEFAULT_DISPLAY);
final Context windowContext = anyContext.createDisplayContext(primaryDisplay);
final View overlayView = Inflater.from(windowContext).inflate(layoutXml, null);

// WindowManager.LayoutParams initialization
...
mParams.type = TYPE_APPLICATION_OVERLAY;
...

mWindowContext.getSystemService(WindowManager.class).addView(overlayView, mParams);

Resources、Configurations、Assets

通過 Context 來到 Resources 后,我們會通過 Resources 拿到 AssetManager 去查找資源,那 Resources、Configuration、Assets 分別是什么呢?


Configuration && Resources && AssetManager.png

查詢邏輯

以查找 dimens 資源為例,其流程如下:


getDimension流程

簡單來說分為三步:


匹配資源流程

解析文件目錄

解析順序和流程如下:


資源配置限符解析過程

查找最優(yōu)文件目錄

順序和流程如下:


資源配置限定符選擇過程

參考:

Google Design Documentation
Google 官方:屏幕兼容性

原創(chuàng)文章,歡迎轉載,但請注明出處

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容