基礎(chǔ)知識(shí):
- statusBar 和navigationBar 都是覆蓋在 phoneWindow 上面牍陌,PhoneWindow 的 DecorView 內(nèi)容會(huì) padding 出兩個(gè)Bar的高度!
- api 21之后可以 statusBar 設(shè)置 SystemUi 怕敬,api19-20 可以通過(guò) window 設(shè)置FLAG_TRANSLUCENT_STATUS。最終使得 fitsSystemWindows 屬性可以控制這部分 padding 空間玄捕,默認(rèn) false去掉 padding , true 保留 padding。
用過(guò)度重繪就可以很明顯的看到這個(gè)結(jié)論
借用黃老師的掌閱來(lái)說(shuō)明這個(gè)問(wèn)題。
著色狀態(tài)欄
Android api 19-20
1. 全屏設(shè)置 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通過(guò) fitsSystemWindows=true 保留 padding摄杂,設(shè)置 window 的背景色
2. 或者在 decorView 上添加 View 設(shè)置背景色
- Android api 21-
1.getWindow().setStatusBarColor(Color.RED) 即 colorPrimaryDark
漸變狀態(tài)欄
Android api 19-20
1. 全屏設(shè)置 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通過(guò) fitsSystemWindows=true 保留 padding,設(shè)置 window 漸變的 Drawable
- Android api 21-
1. 全屏設(shè)置 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
2. StatusBar 顏色透明 getWindow().setStatusBarColor(Color.TRANSPARENT);
3. 通過(guò) fitsSystemWindows=true 保留 padding娇豫,設(shè)置 window 的漸變的 Drawable
背景狀態(tài)欄
Android api 19-20
1. 全屏設(shè)置 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
2. 通過(guò) fitsSystemWindows=true 保留 padding, 設(shè)置 window 的背景圖
- Android api 21-
1. 全屏設(shè)置 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
2. StatusBar 顏色透明 getWindow().setStatusBarColor(Color.TRANSPARENT);
3. 通過(guò) fitsSystemWindows=true 保留 padding匙姜,設(shè)置 window 的背景圖
最后案例
直接在theme中設(shè)置fitsSystemWindows
<item name="android:fitsSystemWindows">true</item>
建議在BaseActivity中的onCreate設(shè)置
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);