Android开发实战总结Manba陪你学AndroidAndroid进阶之路

Android沉浸式状态栏

2017-03-28  本文已影响622人  唠嗑008

什么是沉浸式状态栏

沉浸式状态栏本质上就是给系统状态栏着色。当这个颜色和我们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 沉浸式状态栏攻略 让你的状态栏变色吧

上一篇下一篇

猜你喜欢

热点阅读