沉浸式状态栏

作者: NoBugException | 来源:发表于2019-04-12 14:35 被阅读90次

在Android4.4之后开始支持沉浸式状态栏,如下图

图片.png
(1)起初Android4.4(API19)开始实现沉浸式状态栏

自从Android4.4之后,Android开始支持沉浸式状态栏,实现方式有两种

  • 设置FLAG_TRANSLUCENT_STATUS

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    
  • 在主题中添加属性

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

在4.4手机中的效果如下(左图黑色的状态栏没有消失,右图已经实现了沉浸式效果)

图片.png

在5.0和8.0手机的效果如下(左图和右图都有灰色的阴影)

图片.png

经过多重机型的测试,我们发现并不是所有的手机都能完美实现沉浸式效果的状态栏。

(2)Android5.0以后,解决状态栏灰色阴影的问题

代码如下

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        //注意要清除 FLAG_TRANSLUCENT_STATUS flag
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().setStatusBarColor(getResources().getColor(android.R.color.holo_red_light));
    }

或者设置主题

    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

Android5.0和Android8.0的效果如下:

图片.png
(3)Android6.0以后支持修改状态栏图片的颜色
    //设置状态栏图标颜色为浅黑色
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        //注意要清除 FLAG_TRANSLUCENT_STATUS flag
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }

或者在主题中添加

<item name="android:windowLightStatusBar">true</item>
(4)适配建议

前面三点基本已经算是各版本适配的全部了,为了更好的完善适配问题,还是不要使用主题的好,因为这样看起来很乱,可读性差。

这里推荐使用纯代码适配

(5)纯色适配

纯色适配相对比较简单,下图就是效果

图片.png

代码实现分两步:

1.设置fitsSystemWindows为true,比如标题栏使用Toolbar,那么就用Toolbar设置fitsSystemWindows为true;
2.添加以下代码:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_normal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@mipmap/statusbar">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorAccent"
            android:text="标题"
            android:layout_gravity="center_horizontal"
            android:textSize="20sp"/>
    </LinearLayout>
    
</android.support.v7.widget.Toolbar>
    //设置状态栏图标颜色为浅黑色
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        //注意要清除 FLAG_TRANSLUCENT_STATUS flag
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }
    //修改状态栏颜色
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        //注意要清除 FLAG_TRANSLUCENT_STATUS flag
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary));
    }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        //Android4.4以上手机-顶部状态栏透明
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //Android4.4以上手机-底部导航栏透明
        //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }
(6)图片适配

图片适配的效果如下

图片.png

由于我们需要做到图片延伸到屏幕顶端的效果,所以就不能设置fitsSystemWindows为true了。

代码如下:

    //设置状态栏图标颜色为浅黑色
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        //注意要清除 FLAG_TRANSLUCENT_STATUS flag
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        //Android4.4以上手机-顶部状态栏透明
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //Android4.4以上手机-底部导航栏透明
        //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }

但是,部分5.0以上的手机状态栏有阴影,目前没有什么好的办法解决,5.0新增的setStatusBarColor在这种情况也不太适合。

图片.png
(7)三方库

网上三方库还是比较多的,android4.4以上沉浸式状态栏和导航栏实现以及Bar的其他管理这个三方库还是比较推荐使用的。

相关文章

网友评论

    本文标题:沉浸式状态栏

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