Android沉浸式狀態列實現

yangxi_001發表於2016-08-31

Step1:狀態列與導航欄半透明化

  • 方法一:繼承主題特定主題
    在Android API 19以上可以使用****.TranslucentDecor***有關的主題,自帶相應半透明效果
    例如:

    <style name="FullBleedTheme" parent="android:Theme.Holo.Light.NoActionBar.TranslucentDecor">    
    <!-- API 19 theme customizations can go here. -->
    </style>
  • 方法二:自定義主題中使用一下設定

    <item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
    <item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
  • 方法三:在Activity中設定佈局檔案之後呼叫這些程式碼實現

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window window = getWindow();
    // Translucent status bar
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    // Translucent navigation bar
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }

    SystemBarTint作者提供的變形方法如下

    @TargetApi(19)
    private void setTranslucentStatus(boolean on) {
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
    }

Step2:此時狀態列佔有的位置消失,方法同樣有三

  • 方法一:需要在佈局檔案根佈局中新增一下程式碼

    android:fitsSystemWindows="true"
  • 方法二:在主題中設定如下:

    <item name="android:fitsSystemWindows">true</item>
  • 方法三:使用Java程式碼:

    rootview.setFitsSystemWindows(true);

Step3:設定狀態列和導航欄背景色

這時候狀態列半透明,顯示的顏色根據根佈局的背景顏色而來,由此可以給根佈局背景色位所需的顏色即可。
但是這樣會給根佈局的子佈局控制元件的背景設定帶來不便。
所以採用SystemBarTint實現沉浸式狀態列
方法如下:

SystemBarTintManager tintManager = new SystemBarTintManager(this);
            tintManager.setStatusBarTintEnabled(true);
            tintManager.setNavigationBarTintEnabled(true);
            tintManager.setTintColor(ContextCompat.getColor(this, R.color.colorPrimary));

幾個問題

  • 使用SystemBarTint不能給狀態列設定多個顏色,不能自動取色?
  • Android5.0(API 21)之後ActionBar主題中幾個顏色代表的意義

      <style name="AppTheme" parent="android:Theme.Material">
    <!-- Main theme colors -->
    <!--   your app branding color for the app bar -->
    <item name="android:colorPrimary">@color/primary</item>
    <!--   darker variant for the status bar and contextual app bars -->
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
    <!--   theme UI controls like checkboxes and text fields -->
    <item name="android:colorAccent">@color/accent</item>
      </style>
  • 定製配色工具
    (來自Android官方文件)

相關文章