看上图,Android 4.4之前,即使我们打开手机app,我们还总是能看到系统顶部那条黑乎乎的通知栏,这样会使得app稍显突兀。于是Android 4.4开始,便引入了Translucent System Bar的系特性,用于弥补系统通知栏突兀之处。(估计也是向ios学习,因为ios一大早就有这个特性)。可以在styles配置
values-v19/style.xml
<style name="tanslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
后来在5.0之后又引入了
colorPrimary和colorPrimaryDark,直接在styles配置
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorDark</item> <item name="colorAccent">@color/colorAccent</item> </style>
或者通过代码设置
getWindow().setStatusBarColor(Color.colorDark);
一 .我们先来看看 Translucent System Bar 新特性
原理
- 从4.4后系统增加了透明状态栏的特性
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
一旦添加上这个属性后,那么布局中的内容DecorView
就会自动填充到状态栏。所有的实现都是基于这个特性,就相当于这个时候状态栏会默认空出来,然后开发者可以自定义view来填充这个高度的. - 实现的过程中可能还要用到
android:fitsSystemWindows="true"
,这个属性很重要。
其含义:view可以根据系统窗口(如status bar,软键盘)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间....
相关属性重温
- FitsSystemWindows
在使用FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
、FLAG_TRANSLUCENT_STATUS
挤占了状态栏的高度的时候,我们的布局文件也跟着顶到了状态栏上。通过FitsSystemWindows
,系统会把app布局文件的paddingTop
修改成状态栏的高度,达到适配的效果
false顶到状态栏

1.Android5.0以上:material design风格,半透明
2.Android4.4(kitkat)以上至5.0:全透明
3.Android4.4(kitkat)以下:默认黑色的
主要步骤
- 1
- //透明状态栏
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- //透明导航栏
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
你需要在这个 activity 的 layout xml 文件添加两个属性
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:gravity="center_horizontal"
-
- android:fitsSystemWindows="true"
- android:clipToPadding="true"
-
- android:orientation="vertical" >
这样状态栏的背景就是你的 activity 的主背景.
如果想要图片延伸到状态栏的话,只需要第一步就好了,不用设置android:fitsSystemWindows。因为设置透明状态栏后app的内容会自动网上拉。
另外:设置透明状态栏的有一遍博客写的比较好,推荐看下
http://blog.youkuaiyun.com/ys408973279/article/details/49994407
接下来讲下另外一种5.0之后直接设置状态栏颜色方法
二 . colorPrimary&colorPrimaryDark
用AndroidStudio新建一个项目,浏览res文件夹,找到colors.xml,如下:

<style name="AppTheme.NoActionBar"> <!--状态栏颜色--> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <!--控制各个控件被选中时的颜色--> <item name="colorAccent">@color/colorAccent</item> <!--页面背景色--> <item name="android:windowBackground">@color/windowBackg</item> <!--底部导航栏颜色--> <item name="android:navigationBarColor">@color/navigationColor</item> <!--Appbar背景色--> <item name="android:colorPrimary">@color/colorPrimary</item> <!--ToolBar上的Title颜色--> <item name="android:textColorPrimary">@color/textColorPrimary</item> <!--各个控制控件的默认颜色--> <item name="android:colorControlNormal">@color/colorControlNormal</item> </style>
最后再来一张图详细说明每个item设定的到底是哪里的颜色:
colorPrimary这个属性是主色
colorPrimaryDark这个是状态栏颜色
colorAccent是配色
navigationBarColor是底部导航条的颜色
这里的colorPrimary默认就是ActionBar或者是ToolBar的颜色,colorPrimaryDark就是状态栏的颜色,而下面的colorAccent是Android的强调色,比如FAB的控件颜色,EditText选中时方框下面显示的颜色。
这种方式比较简单,通过直接设置colorprimaryDark的颜色或者通过代码设置
getWindow().setStatusBarColor(Color.colorDark);
就可以达到状态栏半透明或者完全透明状态。
这里所说的半透明状态栏是像QQ那样的,(设置colorprimary和corlorprimaryDark色值不一样)如图:
这里说的完全透明状态栏是像网易云音乐那样的透明状态栏(设置colorprimary和corlorprimaryDark色值一样),如图
那么像饿了么这样的沉浸式状态栏效果该如何实现?
这个效果其实就是让背景图片可以利用系统状态栏的空间,从而能够让背景图和状态栏融为一体。
比如说我现在新建了一个空项目,然后修改布局文件中的代码,在里面加入一个ImageView,如下所示:
其实也很简单,只需要借助另外一种UI Flag就可以了,如下所示:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
首先需要注意,饿了么这样的效果是只有5.0及以上系统才支持,因此这里先进行了一层if判断,只有系统版本大于或等于5.0的时候才会执行下面的代码。
接下来我们使用了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE,注意两个Flag必须要结合在一起使用,表示会让应用的主体内容占用系统状态栏的空间,最后再调用Window的setStatusBarColor()方法将状态栏设置成透明色就可以了。