屏幕適配
屏幕適配常見方式
-
布局適配
- 避免寫死控件尺寸,使用wrap_content , match_parent
- LinerLayout xxx:Layout_weight = "0.5"
- RelativeLayout xxx:Layout_centerInParent="true".....
- ContraintLayout xxx:Layout_contraintLeft_toLeftOf="true"...]
- Percent-support-lib xxx:layout_withPercent="30%" Google的百分比布局容器(已過時)
-
圖片資源適配
- .9圖或者SVG圖實現(xiàn)縮放
- 備用位圖匹配不同分辨率
-
用戶流程適配
- 根據(jù)業(yè)務(wù)邏輯執(zhí)行不同的跳轉(zhuǎn)邏輯
- 根據(jù)別名展示不同的頁面
-
屏幕適配自定義View
- 假設(shè)UI設(shè)計師提供的圖片是在7201280上進行切圖,我們應(yīng)該考慮要做屏幕適配,假設(shè)要顯示一個按鈕,要展示在7201280上,展示屏幕的一半,那他的寬度就是360,如果要是展示在1080*1920上,這個按鈕的寬度必須是540才可以展示屏幕上一半,所以這可以用縮放比例進行適配 目標寬度(720)比上我們的真實屏幕寬度,目標高度(1280)比上我們真是高度,得到相應(yīng)的比例
image
-
百分比布局適配
- 自定義屬性設(shè)置寬高各占父容器的百分比,拿到父容器的寬高乘以百分比得到控件view的寬高
[站外圖片上傳中...(image-4983f5-1561094198638)]
- 修改像素密度 density,scaleDensity,densityDpi
- density:表示像素密度 換句話說每一英寸像素的縮放比例 density = dpi / 160
- scaleDenstiy: 表示字體的縮放比例,默認情況下和density是一致的
- densityDpi:表示每一英寸共有多少個像素點 dpi=density*160
public class Density {
private static final float WIDTH = 320;//參考設(shè)備的寬,單位是dp 320 / 2 = 160
private static float appDensity;//表示屏幕密度
private static float appScaleDensity; //字體縮放比例,默認appDensity
public static void setDensity(final Application application, Activity activity){
//獲取當前app的屏幕顯示信息
DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
if (appDensity == 0){
//初始化賦值操作
appDensity = displayMetrics.density;
appScaleDensity = displayMetrics.scaledDensity;
//添加字體變化監(jiān)聽回調(diào)
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
//字體發(fā)生更改,重新對scaleDensity進行賦值
if (newConfig != null && newConfig.fontScale > 0){
appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
//計算目標值density, scaleDensity, densityDpi
float targetDensity = displayMetrics.widthPixels / WIDTH; // 1080 / 360 = 3.0
float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);
int targetDensityDpi = (int) (targetDensity * 160);//屏幕上每一寸有160個像素點
//替換Activity的density, scaleDensity, densityDpi
DisplayMetrics dm = activity.getResources().getDisplayMetrics();
dm.density = targetDensity;
dm.scaledDensity = targetScaleDensity;
dm.densityDpi = targetDensityDpi;
}
}
-
劉海屏 適配
- 首先設(shè)置全屏模式
requestWindowFeature(Window.FEATURE_NO_TITLE); Window window = getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- 首先設(shè)置全屏模式
-
劉海屏的幾種模式
WindowManager.LayoutParams params = window.getAttributes(); /** * * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,內(nèi)容下移,非全屏不受影響 * * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允許內(nèi)容去延伸進劉海區(qū) * * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允許內(nèi)容延伸進劉海區(qū) */ params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; window.setAttributes(params); -
追加沉浸式
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; int visibility = window.getDecorView().getSystemUiVisibility(); visibility |= flags; //追加沉浸式設(shè)置 window.getDecorView().setSystemUiVisibility(visibility); -
其他手機廠商(華為,小米,oppo,vivo)適配
Demo地址
感謝
謝謝大家的閱讀,想要了解更多,請關(guān)注我