android状态栏半透明灰色,Android7.0沉浸式状态栏蒙灰问题完美解决

博客围绕Android系统中去除状态栏半透明蒙灰展开。介绍了DecorView类在7.0前后的变化,给出常规去除半透明状态栏的代码。还指出7.0之后有时无法去除蒙灰的情况,通过分析源码,给出利用反射修改属性实现全透明效果的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DecorView是Window的顶层view, 也就是说我们所有的控件都是包含在这个view中的. android7.0之前这个类是PhoneWindow的一个内部类, 7.0之后是一个独立的类, 同时也增加了一些新的属性和方法.

先看2张图片:

5b0ef2c7e7d6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

5b0ef2c7e7d6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

我们想要实现第2张图的效果, 应当在style中添加属性 true 发现出来的效果是第一种, 上面竟然蒙了一层半透明view, 要想去除这层view也很简单, 我们一般会在setContentView()之前添加一下代码:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);   //去除半透明状态栏

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);  //一般配合fitsSystemWindows()使用, 或者在根部局加上属性android:fitsSystemWindows="true", 使根部局全屏显示

getWindow().setStatusBarColor(Color.TRANSPARENT);

但是android7.0之后有时候我们通过上述方法还是不能去除蒙灰(原因尚不明确), 下面是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之后会强制绘制statusbar的背景色, 而且在其他条件都满足情况下还会加上半透明效果, 所以如果第一种方法去除不掉半透明的情况下可以通过反射拿到mSemiTransparentStatusBarColor这个属性, 然后实现全透明效果,

完美解决代码如下:

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透明状态栏

//透明状态栏

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

//            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);//完全隐藏状态栏

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

}

------>>在setContentView()之前通过反射修改mSemiTransparentStatusBarColor值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值