屏幕適配

屏幕適配

屏幕適配常見方式

  • 布局適配

    • 避免寫死控件尺寸,使用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);
      
      
  • 劉海屏的幾種模式

    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)適配

    華為廠商劉海適配地址

    小米廠商劉海適配地址

    Oppo廠商劉海適配地址

    Vivo廠商劉海適配地址

Demo地址

感謝

謝謝大家的閱讀,想要了解更多,請關(guān)注我

Github

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

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

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