Android高級-網易雲音樂屏幕適配

爲什麼要進行屏幕適配

屏幕碎片化表現爲以下幾個方面:

1:屏幕尺寸碎片化:

2:屏幕密度碎片化

3:廠商碎片化:水滴屏,劉海屏

屏幕適配常見方式

 

二 

 

谷歌推出的百分比佈局

手寫百分比佈局;

 

爲什麼百分比佈局要這麼寫:

子控件的屬性的創建依賴於父容器的LayoutParams,查看源碼可得。。。

 

所以如果實現自定義佈局,自定義佈局的屬性也需要繼承自父容器的LayoutParams

density:屏幕密度,android系統內部對一個尺寸的分辨率,縮放比率,屏幕上每一寸有160個px,就是density的值

             例如,如果某個屏幕的某英寸達到了320px,那麼density是2; 類似於縮放比例的scale

scaleDensity:字體縮放比率,默認跟density一樣的

densityDpi:屏幕上每一英寸的像素點有多少個,160 或  320 有多少個

android顯示最終都會轉化成px來顯示,同一個分比率下的density也不一樣,

缺點:暫時沒有發現

 

       

例如

運行效果:系統的黑邊就是系統對他的默認處理,就是將內容區域進行向下移動,所以需要適配:

那麼我們能用谷歌官方9.0的對這個的處理:一共有三種方式

首先兩點,application的

android:theme="@style/Theme.AppCompat.Light.NoActionBar

下面window的API是

targetSdkVersion 28

 

 第二種是允許內容區域進入劉海屏區域,白色部分爲頂層佈局背景是白色,只需要做沉浸式就可以了

第三種是不管是否爲全屏模式,都不允許進入劉海區域

                      第二種                                      第三種/全屏模式                     第三種非全屏模式  

好的  下面我們就把二種設置成沉浸式

運行結果:我大胡歌真的好帥啊!!!!!

總結:

適配劉海屏

1:設置全屏

   //1.設置全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

2:讓內容區域延申進劉海

 //判斷手機是否是劉海屏
          boolean hasDisplayCutout = hasDisplayCutout(window);
          if (hasDisplayCutout){
            //2.讓內容區域延伸進劉海
            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);
    private boolean hasDisplayCutout(Window window) {

        DisplayCutout displayCutout;
        View rootView = window.getDecorView();
        WindowInsets insets = rootView.getRootWindowInsets();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && insets != null){
            displayCutout = insets.getDisplayCutout();
            if (displayCutout != null){
                if (displayCutout.getBoundingRects() != null && displayCutout.getBoundingRects().size() > 0 && displayCutout.getSafeInsetTop() > 0){
                    return true;
                }
            }
        }
        return true; //因爲模擬器原因,這裏設置成true
    }

 3:設置成沉浸式

  //3.設置成沉浸式
            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);

劉海屏設計的時候需要避免頁面設計在劉海屏位置   或者直接將內容區域下移動,

   //通常情況下,劉海的高就是狀態欄的高
    public int heightForDisplayCutout(){
        int resID = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resID > 0){
            return getResources().getDimensionPixelSize(resID);
        }
        return 96;
    }

其他手機廠商(華爲,小米,oppo,vivo)適配

華爲:htttps://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114

小米:https://dev.mi.com/comsole/doc/detail?pid=1293

oppo:https://open.open.oppombile.com/service/message/dtail?id=61876

vivo:https://dev.vivo.vom.vn/documentCenter/doc/103

華爲的官方文檔沒有了,下面是我從其他博客找的 ,跟上面的適配差不多:

原博客地址:https://blog.csdn.net/xiangzhihong8/article/details/80317682

 

以上,下面開始介紹網易雲音樂的屏幕適配

一  對比其他適配方式:

限定符適配:

app會根據當前手機的分辨率自動選擇對應的dimen.xml

優點:適配比較精確

缺點:增加apk大小  適配機型越多,需要的xml也就越多

           適配所有機型的分辨率,xml文件加起來有3m的大小

百分比適配:

優點:通過百分比定義寬度,高度,比較方便

            徹底拋棄ps  dp單位 通過百分比實現,可以在佈局完成      適配

           對開發者工作量減少

缺點:需要對頁面的容器都用自定義的

 

網易雲代碼動態適配

是通過代碼對需要適配的佈局進行動態計算:

Demo整理好以後再更新~

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章