Android 4.4以上の「浸入式」ステータスバーの効果の実現方法


没入式のステータスバーは何ですか?
ステータスバーとは、ステータスバーの色がソフトウェアの色によって変わり、ステータスバーとソフトウェアの色が一致している状態になることを意味します。アプリケーションを開くと、アプリケーションとステータスバーの黒いところが開いているのを見て、みっともないとは思いません。没頭型のステータスバーはユーザー層に素晴らしいユーザー体験をもたらしますので、ますます多くのアプリケーションに反映されています。
原理を実現する
      4.4以降のシステムから透明ステータスバーの特性WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
が追加されると、レイアウト内のコンテンツDecorViewが自動的にステータスバーに塗りつぶされます。すべての実装はこの特性に基づいています。この時点でステータスバーはデフォルトで空になります。
     実装中には、android:fitsSystemWindows="true"も使用されるかもしれないが、この属性は重要である。その意味:viewはシステムウィンドウ(status bar、ソフトキーボード)によって自分のレイアウトを調整できます。もし値がtrueであれば、viewのpaingding属性を調整してsystem windowsに空間を残します。
具体的な実現方法を見てみましょう。

一般ページは自分でクラスタイトルバーを定義します。
実現する
実現効果から、ここは大きく二つに分けられます。
1、単独でステータスバーを着色する
このオープンソースライブラリを使うSystemBarTint

 /**
  *          
  * @param context
  * @param color
  */
 public static void smartTintManager(Activity context, int color){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
     Window window = context.getWindow();
     window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
     //           
     SystemBarTintManager tintManager = new SystemBarTintManager(context);
     //        
     tintManager.setStatusBarTintEnabled(true);
     tintManager.setStatusBarTintColor(color);
   }
 }
対応するページのルートレイアウトにandroid:fitsSystemWindows="true" を追加し、ルートレイアウトに全体的な背景色を設定できない場合、ステータスバーの色が上書きされます。
上記の方法を呼び出して具体的な色を設定します。
ここでは主に具体的な実現原理について説明します。

 private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
   mStatusBarTintView = new View(context);
   LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());
   params.gravity = Gravity.TOP;
   if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {
     params.rightMargin = mConfig.getNavigationBarWidth();
   }
   mStatusBarTintView.setLayoutParams(params);
   mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
   mStatusBarTintView.setVisibility(View.GONE);
   decorViewGroup.addView(mStatusBarTintView);
 }
このコードによって、動的にviewを生成し、このview幅はMATCH_PARENTであり、高度はシステム状態バーの高さであることが分かります。この動的に生成されたビューの背景色を設定します。最後にこのviewをdecorViewGroupのview容器に追加します。このviewはいったい誰ですか?

 /**
  * Constructor. Call this in the host activity onCreate method after its
  * content view has been set. You should always create new instances when
  * the host activity is recreated.
  *
  * @param activity The host activity.
  */
 @TargetApi(19)
 public SystemBarTintManager(Activity activity) {

   Window win = activity.getWindow();
   //  DecorView     
   ViewGroup decorViewGroup = (ViewGroup) win.getDecorView(); 
   ..... 
   if (mStatusBarAvailable) {
     //   view   decorViewGroup
     setupStatusBarView(activity, decorViewGroup);
   }
   if (mNavBarAvailable) {
     setupNavBarView(activity, decorViewGroup);
   }

 }
上の二つの手動で追加した注釈を見ると、このような方法はステータスバーが透明になった後、ルートレイアウトdecorViewGroupに一つとステータスバーなどの高さのviewを追加するという考えが分かります。このviewをどんな色にするかは、あなたの気持ち次第です。
2、タイトルバーの背景色でステータスバーを塗りつぶします。
ステータスバーを半透明に設定した場合、問題は以下の内容がステータスバーを占有します。
activityのルートレイアウトにandroid:fitsSystemWindows="true"
を追加したら
状態バーはまだ見られます。占有していません。この属性の役割はここにあります。
このとき、ステータスバーの高さを借りて、以下の内容にpadding-top距離を設定します。(ステータスバーが半透明になると、下の内容が元のステータスバーを占有しますので、paddingのステータスバーの高さを設定すればいいです。)。このように設定した後、このビューの背景のpaddingの下で、元のステータスバーの高さは同じ背景色を満たしています。そうすると、いわゆる没頭式のようです。
このように言いますと、ステータスバーが半透明になったら、下の内容で適切に塗りつぶします。
コードは以下の通りです

@SuppressLint("InlinedApi")
public static void setImmerseLayout(Activity context, View view) {
  if (context == null || view == null) {
    return;
  }
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window window = context.getWindow();
    window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    int statusBarHeight = getStatusBarHeight(context.getBaseContext());
    view.setPadding(0, statusBarHeight, 0, 0);
  }
}

/**
 *           。   Resource    (      )
 *
 * @return            。
 */
public static int getStatusBarHeight(Context context) {
  int result = 0;
  int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
    result = context.getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}
このviewにpadding_topを設けて、このpaddingの距離はちょうどステータスバーの高さです。このviewの背景はステータスバーに埋められます。
このタイトルバーの高さは必ずwrap_contentなら、具体的な高さであれば、paddingtopを設けると、一部のタイトルバーの内容が絞り出され、不完全になるからです。
したがって、通常の方法は、既存のタイトルバーの外側に<FrameLayout />を入れ子し、タイトルバーの背景色を<FrameLayout />の背景色に設定することである。

 <FrameLayout
   android:id="@+id/title"
   android:layout_width="match_parent"
   android:background="@color/common_theme_color"
   android:layout_height="wrap_content">
締め括りをつける
浸式効果の実現方法についてはこれまでですが、この文章の内容は皆さんの学習や仕事に一定の助けを与えてくれると思います。疑問があれば、皆さんもメッセージを残して交流してください。