沉浸式狀態欄

在Android4.4之後開始支持沉浸式狀態欄,如下圖

(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手機中的效果如下(左圖黑色的狀態欄沒有消失,右圖已經實現了沉浸式效果)

在5.0和8.0手機的效果如下(左圖和右圖都有灰色的陰影)

經過多重機型的測試,我們發現並不是所有的手機都能完美實現沉浸式效果的狀態欄。

(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的效果如下:

(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)純色適配

純色適配相對比較簡單,下圖就是效果

代碼實現分兩步:

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)圖片適配

圖片適配的效果如下

由於我們需要做到圖片延伸到屏幕頂端的效果,所以就不能設置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在這種情況也不太適合。

(7)三方庫

網上三方庫還是比較多的,android4.4以上沉浸式狀態欄和導航欄實現以及Bar的其他管理這個三方庫還是比較推薦使用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章