沉浸式状态栏解析

基础知识:

  • 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);
复制代码

感谢

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值