相關單位
我們常用的資源單位有px、dp、sp、dpi,如圖:
補充
發現有些視覺同學可能不大清楚開發要的視覺標注中 dp 和 px 的區別。這邊說下,
px 是指像素,比如車機的物理尺寸為[1920, 720]px,像素密度為 160dpi,像素密度(dpi)為單位面積的像素數。
而 dp 是指密度無關像素(開發在代碼中需要使用到的單位),我們規定在中密度(mdpi:~160dpi)的屏幕上 1dp = 1px。因此如果某個屏幕的像素密度為 480dpi,那么在這個屏幕上 1dp = 480/160 px = 3px。
但我們車機是 160dpi ,因此其 1dp = 1px。
所以在輸出車機的視覺標注時,直接輸出 [1920, 720]dp 的標注就行。
Context
我們知道 Context 提供訪問應用獨有資源的接口,如圖:
但從 android R 之后只能從 Activity 或者 WindowContext 來訪問資源(在多窗口模式下僅這其它 Context 獲取的 Configuration 可能錯誤)。
如需要在主屏幕上添加應用覆蓋的窗口,需要用 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 分別是什么呢?
查詢邏輯
以查找 dimens 資源為例,其流程如下:
簡單來說分為三步:
解析文件目錄
解析順序和流程如下:
查找最優文件目錄
順序和流程如下:
參考:
Google Design Documentation
Google 官方:屏幕兼容性
原創文章,歡迎轉載,但請注明出處