Android沉浸式状态栏

作者: 唠嗑008 | 来源:发表于2017-03-28 10:01 被阅读622次

    什么是沉浸式状态栏

    沉浸式状态栏本质上就是给系统状态栏着色。当这个颜色和我们Activity中的ToolBar或者ActionBar所使用的背景颜色一致时就会有沉浸式的效果。

    怎么给状态栏着色

    这里我们在Activity中将状态栏颜色设置为红色:

      Window window = getWindow();
      window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
      window.setStatusBarColor(Color.parseColor("#FF0000"));
    

    注意,上面的代码假设当前系统API Level >= 21,因为只有满足条件的SDK版本才能找到该方法;与此同时,在设置状态栏颜色的同时,API文档 告诉我们还需要同步设置WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS这个Window Flag,并且需要保证WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS这个Window Flag没有被设置。否则,不会生效。

    上面,我们通过方法调用给系统状态栏着色;当然也可以通过指定Theme来完成;

        <style name="CustomAppTheme" parent="android:Theme.Light">
            <item name="android:statusBarColor">#00FF00</item>
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        </style>
    

    android:windowDrawsSystemBarBackgrounds为true必不可少;就像上面使用setStatusColor方法时需要注意的那样,这个属性相当于添加了FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS(当然你也可以不在Theme中指定这个属性,使用如上代码那种方式添加Window Flag);而从Material Theme中继承时没有那样做,是因为Material Theme中它默认值为true。

    注意,上面Theme的声明,对应的资源文件应该在values-v21文件夹下。因为不管是相应的属性,还是对应的Material Theme都是至少API 21才能使用的。

    兼容低版本

    OK,到此为止,我们所讨论的都是基于API 21以上的。如果低版本该怎么办?低版本的系统是不支持给状态栏着色的,但却可以通过 透明状态栏+透明背景颜色 来实现相同的效果;废话不多说,来看实现。

    1、将系统状态栏设置为透明

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    

    或者Theme Attribute的方式

      <item name="android:windowTranslucentStatus">true</item>
    

    设置对应背景颜色

    接下来,就是背景颜色的设置。首先需要将ActionBar或者ToolBar的背景颜色设置为我们需要的颜色,具体如何设置不再深入,请自行研究(这里,如果没有使用到ActionBar或者ToolBar,这一步可直接略过)。

    注意,上面透明栏+背景色的方式只适用于API 19以上,因为这个版本以上的系统才支持透明化状态栏,所以,19以下的系统不支持沉浸式状态栏

    参考:
    Android沉浸式状态栏的3种实现方式
    Android 沉浸式状态栏攻略 让你的状态栏变色吧

    相关文章

      网友评论

        本文标题:Android沉浸式状态栏

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