沉浸式狀態列解析

keyboard3發表於2018-01-23

基礎知識:

  • statusBar 和navigationBar 都是覆蓋在 phoneWindow 上面,PhoneWindow 的 DecorView 內容會 padding 出兩個Bar的高度!
  • api 21之後可以 statusBar 設定 SystemUi ,api19-20 可以通過 window 設定FLAG_TRANSLUCENT_STATUS。最終使得 fitsSystemWindows 屬性可以控制這部分 padding 空間,預設 false去掉 padding , true 保留 padding。

用過度重繪就可以很明顯的看到這個結論 借用黃老師的掌閱來說明這個問題。

未滾動前,狀態列繪製是沒有顏色的
滾動後,可以明顯的看到在狀態列底部繪製了我們的window的內容

著色狀態列

Android api 19-20

1. 全屏設定 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通過 fitsSystemWindows=true 保留 padding,設定 window 的背景色
2. 或者在 decorView 上新增 View 設定背景色
複製程式碼
  • Android api 21-
1.getWindow().setStatusBarColor(Color.RED) 即 colorPrimaryDark
複製程式碼

漸變狀態列

Android api 19-20

1. 全屏設定 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通過 fitsSystemWindows=true 保留 padding,設定 window 漸變的 Drawable
複製程式碼
  • Android api 21-
1. 全屏設定 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
2. StatusBar 顏色透明 getWindow().setStatusBarColor(Color.TRANSPARENT);
3. 通過 fitsSystemWindows=true 保留 padding,設定 window 的漸變的 Drawable
複製程式碼

背景狀態列

Android api 19-20

1. 全屏設定 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通過 fitsSystemWindows=true 保留 padding, 設定 window 的背景圖
複製程式碼
  • Android api 21-
1. 全屏設定 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
2. StatusBar 顏色透明 getWindow().setStatusBarColor(Color.TRANSPARENT);
3. 通過 fitsSystemWindows=true 保留 padding,設定 window 的背景圖
複製程式碼

最後案例

直接在theme中設定fitsSystemWindows

<item name="android:fitsSystemWindows">true</item>
複製程式碼

建議在BaseActivity中的onCreate設定

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(Color.TRANSPARENT);
            getWindow().getDecorView()
                    .setSystemUiVisibility(
                            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        getWindow().setBackgroundDrawableResource(R.drawable.bg_bar);
複製程式碼

感謝

全屏、沉浸式、fitSystemWindow使用及原理分析:全方位控制“沉浸式”的實現

相關文章