基礎知識:
- statusBar 和navigationBar 都是覆蓋在 phoneWindow 上面,PhoneWindow 的 DecorView 內容會 padding 出兩個Bar的高度!
- api 21之後可以 statusBar 設定 SystemUi ,api19-20 可以通過 window 設定FLAG_TRANSLUCENT_STATUS。最終使得 fitsSystemWindows 屬性可以控制這部分 padding 空間,預設 false去掉 padding , true 保留 padding。
用過度重繪就可以很明顯的看到這個結論 借用黃老師的掌閱來說明這個問題。
著色狀態列
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);
複製程式碼