美文网首页
沉浸式状态栏解析

沉浸式状态栏解析

作者: keyboard3 | 来源:发表于2017-06-24 01:00 被阅读98次

    基础知识:

    • statusBar 和navigationBar 都是覆盖在 phoneWindow 上面,PhoneWindow 的 DecorView 内容会 padding 出两个Bar的高度!
    • api 21之后可以 statusBar 设置 SystemUi ,api19-20 可以通过 window 设置FLAG_TRANSLUCENT_STATUS。最终使得 fitsSystemWindows 属性可以控制这部分 padding 空间,默认 false去掉 padding , true 保留 padding。

    用过度重绘就可以很明显的看到这个结论
    借用黄老师的掌阅来说明这个问题。

    未滚动前,状态栏绘制是没有颜色的
    滚动后,可以明显的看到在状态栏底部绘制了我们的window的内容

    着色状态栏

    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使用及原理分析:全方位控制“沉浸式”的实现

    相关文章

      网友评论

          本文标题:沉浸式状态栏解析

          本文链接:https://www.haomeiwen.com/subject/lidhcxtx.html