Android之沉浸式狀態欄的實現


沉浸式狀態欄確切的說應該叫做透明狀態欄。一般情況下,狀態欄的底色都為黑色,而沉浸式狀態欄則是把狀態欄設置為透明或者半透明。

為什么要使用沉浸式狀態欄

沉浸式狀態欄是從android Kitkat(Android 4.4)開始出現的,它可以被設置成與APP頂部相同的顏色,這就使得切換APP時,整個界面就好似切換到了與APP相同的風格樣式一樣。在內容展示上會顯得更加美觀。

實現方式

需要注意的是,因為沉浸式狀態欄是在Android4.4的時候出現的,所以只有4.4及以后的版本才能使用。實現沉浸式狀態欄的方式有幾種,最簡單的方式就是使用系統提供的方式進行實現。

系統提供的方法

  1. 在需要實現沉浸式狀態欄的Activity的布局中添加以下參數
android:fitsSystemWindows="true"
android:clipToPadding="true"
  1. 代碼中對當前系統進行判斷,符合要求(即系統是4.4或以上的版本)則設置成透明狀態欄
private void initState() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
 		//透明狀態欄
    	getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //透明導航欄
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  }
}
  1. 在Activity的setContentView()方法后面調用第二步驟的方法即可。

我在使用小米手機測試這個方法的時候出現了兩種情況

  • 當我沒有在布局中設置clipToPadding為true的時候,會對應用的頂部Toolbar進行拉伸;
  • 當我在布局中兩個參數都進行設置后,頂部狀態欄變成了白色。

因此,我使用了第二種方法:添加隱藏布局,動態調整布局高度適應狀態欄

動態適應狀態欄高度設置布局

因為第一部會出現的拉伸問題,所以我在Toolbar上方添加了一個隱藏LinearLayout,動態設置與狀態欄等高,抵消Toolbar拉伸。

  1. 在xml布局的頂部添加一個隱藏布局
<LinearLayout
        android:id="@+id/ll"
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:orientation="vertical"
        android:background="#e7abff"<!--顏色被我設置成了與Toolbar一樣-->
        android:visibility="gone">
    </LinearLayout>
  1. 代碼中判斷系統版本,並通過反射設置隱藏布局高度
/**
* 動態的設置狀態欄  實現沉浸式狀態欄
*/
private void initState() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        //透明狀態欄
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //透明導航欄
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        
        LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
        linear_bar.setVisibility(View.VISIBLE);
        //獲取到狀態欄的高度
        int statusHeight = getStatusBarHeight();
        //動態的設置隱藏布局的高度
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();
        params.height = statusHeight;
        linear_bar.setLayoutParams(params);
    }
}
/**
* 通過反射的方式獲取狀態欄高度
* @return
*/
private int getStatusBarHeight() {
    try {
        Class<?> c = Class.forName("com.android.internal.R$dimen");
        Object obj = c.newInstance();
        Field field = c.getField("status_bar_height");
        int x = Integer.parseInt(field.get(obj).toString());
        return getResources().getDimensionPixelSize(x);
    } catch (Exception e) {
        e.printStackTrace();
    }
     return 0;
}
  1. 上述步驟完成后同樣也是在Activity中的setContentView()后進行調用即可。

使用第三方庫進行實現

在github上也有開源的庫提供使用,如:SystemBarTint

不得不說開源的力量是如此的強大。使用方法在連接里有介紹,這里就不復述了。

更多文章也可關注我的靜態博客,更新相對會優先些傳送門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM