屏幕適配

屏幕適配常見方式git

  • 佈局適配github

    • 避免寫死控件尺寸,使用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的百分比佈局容器(已過期)
  • 圖片資源適配bash

    • .9圖或者SVG圖實現縮放
    • 備用位圖匹配不一樣分辨率
  • 用戶流程適配app

    • 根據業務邏輯執行不一樣的跳轉邏輯
    • 根據別名展現不一樣的頁面
  • 屏幕適配自定義Viewide

    • 假設UI設計師提供的圖片是在7201280上進行切圖,咱們應該考慮要作屏幕適配,假設要顯示一個按鈕,要展現在7201280上,展現屏幕的一半,那他的寬度就是360,若是要是展現在1080*1920上,這個按鈕的寬度必須是540才能夠展現屏幕上一半,因此這能夠用縮放比例進行適配 目標寬度(720)比上咱們的真實屏幕寬度,目標高度(1280)比上咱們真是高度,獲得相應的比例
  • 百分比佈局適配佈局

    • 自定義屬性設置寬高各佔父容器的百分比,拿到父容器的寬高乘以百分比獲得控件view的寬高
  • 修改像素密度 density,scaleDensity,densityDpi
    • density:表示像素密度 換句話說每一英寸像素的縮放比例 density = dpi / 160
    • scaleDenstiy: 表示字體的縮放比例,默認狀況下和density是一致的
    • densityDpi:表示每一英寸共有多少個像素點 dpi=density*160
public class Density {

    private static final float  WIDTH = 320;//參考設備的寬,單位是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;

            //添加字體變化監聽回調
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    //字體發生更改,從新對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;
    }

}
複製代碼
  • 劉海屏 適配字體

    • 首先設置全屏模式
      requestWindowFeature(Window.FEATURE_NO_TITLE);
          Window window = getWindow();
          window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
          WindowManager.LayoutParams.FLAG_FULLSCREEN);
      
      複製代碼
  • 劉海屏的幾種模式ui

    WindowManager.LayoutParams params = window.getAttributes();
             /**
              *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,內容下移,非全屏不受影響
              *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 容許內容去延伸進劉海區
              *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不容許內容延伸進劉海區
              */
             params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
             window.setAttributes(params);
    複製代碼
  • 追加沉浸式spa

    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; //追加沉浸式設置
             window.getDecorView().setSystemUiVisibility(visibility);
    
    複製代碼
  • 其餘手機廠商(華爲,小米,oppo,vivo)適配設計

    華爲廠商劉海適配地址

    小米廠商劉海適配地址

    Oppo廠商劉海適配地址

    Vivo廠商劉海適配地址

Demo地址

感謝

謝謝你們的閱讀,想要了解更多,請關注我

Github

相關文章
相關標籤/搜索