android状态栏半透明灰色,Android7.0沉浸式状态栏蒙灰问题完美解决
DecorView是Window的頂層view, 也就是說我們所有的控件都是包含在這個(gè)view中的. android7.0之前這個(gè)類是PhoneWindow的一個(gè)內(nèi)部類, 7.0之后是一個(gè)獨(dú)立的類, 同時(shí)也增加了一些新的屬性和方法.
先看2張圖片:
我們想要實(shí)現(xiàn)第2張圖的效果, 應(yīng)當(dāng)在style中添加屬性 true 發(fā)現(xiàn)出來的效果是第一種, 上面竟然蒙了一層半透明view, 要想去除這層view也很簡(jiǎn)單, 我們一般會(huì)在setContentView()之前添加一下代碼:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);?? //去除半透明狀態(tài)欄
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);? //一般配合fitsSystemWindows()使用, 或者在根部局加上屬性android:fitsSystemWindows="true", 使根部局全屏顯示
getWindow().setStatusBarColor(Color.TRANSPARENT);
但是android7.0之后有時(shí)候我們通過上述方法還是不能去除蒙灰(原因尚不明確), 下面是7.0在DecorView中新添加的一部分源碼
DecorView(Context context, int featureId, PhoneWindow window, WindowManager.LayoutParams params) {
......
mForceWindowDrawsStatusBarBackground = ????????context.getResources().getBoolean(R.bool.config_forceWindowDrawsStatusBarBackground)
&& context.getApplicationInfo().targetSdkVersion >= N;
mSemiTransparentStatusBarColor = context.getResources().getColor(R.color.system_bar_background_semi_transparent, null);
......
}
private int calculateStatusBarColor() {
int flags = mWindow.getAttributes().flags;
return (flags & FLAG_TRANSLUCENT_STATUS) != 0 ? mSemiTransparentStatusBarColor : (flags & ????????????FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 ? mWindow.mStatusBarColor : Color.BLACK;
從源碼可以看到androidx.x之后會(huì)強(qiáng)制繪制statusbar的背景色, 而且在其他條件都滿足情況下還會(huì)加上半透明效果, 所以如果第一種方法去除不掉半透明的情況下可以通過反射拿到mSemiTransparentStatusBarColor這個(gè)屬性, 然后實(shí)現(xiàn)全透明效果,
完美解決代碼如下:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
try {
Class decorViewClazz = Class.forName("com.android.internal.policy.DecorView");
Field field = decorViewClazz.getDeclaredField("mSemiTransparentStatusBarColor");
field.setAccessible(true);
field.setInt(getWindow().getDecorView(), Color.TRANSPARENT);? //改為透明
} catch (Exception e) {}
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//7.0透明狀態(tài)欄
//透明狀態(tài)欄
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//? ? ? ? ? ? getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);//完全隱藏狀態(tài)欄
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
------>>在setContentView()之前通過反射修改mSemiTransparentStatusBarColor值
總結(jié)
以上是生活随笔為你收集整理的android状态栏半透明灰色,Android7.0沉浸式状态栏蒙灰问题完美解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: px4 uavcan linux,PX4
- 下一篇: 用html修改游戏聊天字体,前端使用自定