Android 状态栏设置

                                                             


看上图,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_BACKGROUNDSFLAG_TRANSLUCENT_STATUS挤占了状态栏的高度的时候,我们的布局文件也跟着顶到了状态栏上。通过FitsSystemWindows,系统会把app布局文件的paddingTop修改成状态栏的高度,达到适配的效果

    false顶到状态栏

true,paddingTop有一个状态栏高度
并且这种方式在每个版本上的最终效果不是一样的

1.Android5.0以上:material design风格,半透明  

2.Android4.4(kitkat)以上至5.0:全透明

3.Android4.4(kitkat)以下:默认黑色的

主要步骤

  1. 1
  2.  
  3. //透明状态栏
  4. getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  5.  //透明导航栏
  6. getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  7.                  


2

你需要在这个 activity 的 layout xml 文件添加两个属性

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="fill_parent"
  3.     android:layout_height="fill_parent"
  4.     android:gravity="center_horizontal"
  5.     
  6.     android:fitsSystemWindows="true"
  7.     android:clipToPadding="true"

    android:backgroud="#fffffff"
  1.     
  2.     android:orientation="vertical" >

这样状态栏的背景就是你的 activity 的主背景.

如果想要图片延伸到状态栏的话,只需要第一步就好了,不用设置android:fitsSystemWindows。因为设置透明状态栏后app的内容会自动网上拉。

另外:设置透明状态栏的有一遍博客写的比较好,推荐看下 

http://blog.csdn.net/ys408973279/article/details/49994407

接下来讲下另外一种5.0之后直接设置状态栏颜色方法

二 . colorPrimary&colorPrimaryDark

 

用AndroidStudio新建一个项目,浏览res文件夹,找到colors.xml,如下:


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,如下所示:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/bg"
        android:scaleType="centerCrop" />

</RelativeLayout>

其实也很简单,只需要借助另外一种UI Flag就可以了,如下所示:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
    View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    decorView.setSystemUiVisibility(option);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
}

  • 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()方法将状态栏设置成透明色就可以了。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页