androidステータスバー一体化(浸式ステータスバー)


Android浸漬式ステータスバー、ステータスバー一体化、透明状態バー、擬ios透明状態バー 
http://blog.csdn.net/jdsjlzx/article/details/50437779
注:ステータスバーのフォントの色はホワイトで、ステータスバーの背景がホワイトなら、上のブログはもう解決しました.
原文の出所:http://niorgai.github.io/2016/03/20/Android-transulcent-status-bar/ 
最近業務で設計図を見るととても綺麗なので、透明な状態の欄を調べてみました.夢中にならないように注意してください.ネット上の資料を参考にして、このブログを整理しました.
Github Demoリンク: Status BarComppat参考文章:
浸漬式状態バーによる血相Transloucent System Barの最適な実践fits System Windowsを使うべきです.まず、ステータスバーの処理には2つの方法があります.ここではTranslect System Barの最適な実践から直接に2つの図を盗みました.
フルスクリーン(コンテントビューはステータスバーに入ることができます.)
非フルスクリーン(コンテントビューとステータスバーが分離され、ステータスバーが直接着色されます.)
android状态栏一体化(沉浸式状态栏)_第1张图片
android状态栏一体化(沉浸式状态栏)_第2张图片
いくつかの名詞を先に定義します.
フルスクリーンモード:左図に示す.着色モード:右図に示す.ConttentView: activity.findView ById(Window.ID ANDROID CONTENT) 取得したViewは、 set ContentView メソッドが設定したビューは、実質的に Frame Layout.Conttent Part: ConttentView のparent、実質は Linear Layout.ChildView: ConttentView の最初のサブViewは、レイアウトファイルの中のラyoutです.関連する関数を紹介します.
fits System Windowsは、システムViewのために空間を残しておくかどうか設定できます.trueに設定すると、ステータスバーの空間を残します.ContentView、実質は コンテントFrame Layoutですが、書き直しました. dispatch Fit System Windows メソッドですので、設定します. fits System Windows 無効です.Conttent Parts,実質は Fit Windows Lineear Layoutの中で最初のViewは View StubComputは、もしテーマが設定されていないなら、inflateはありません.二つ目のViewは ContentView.5.0以上の処理:
5.0からMaterial Designを導入して、ステータスバーは開発者により直接的に起動できます. set Status BarColor を選択して、ステータスバーの色を設定します.
フルスクリーンモード:
Window window = activity.getWindow();
//       ,      ContentView   
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

//       flag      setStatusBarColor         
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
//       
window.setStatusBarColor(statusColor);

ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
View mChildView = mContentView.getChildAt(0);
if (mChildView != null) {
    //       ContentView   FitsSystemWindows,      ContentView       View .        View     .
    ViewCompat.setFitsSystemWindows(mChildView, false);
}
カラーモード:
Window window = activity.getWindow();
//         ,  ContentView          
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

//       flag      setStatusBarColor         
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
//       
window.setStatusBarColor(statusColor);

ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
View mChildView = mContentView.getChildAt(0);
if (mChildView != null) {
    //       ContentView   FitsSystemWindows,      ContentView       View .       View    .
    ViewCompat.setFitsSystemWindows(mChildView, true);
}
4.4-5.0の処理:
4.4-5.0直接のAPIがないので、自分の互換性のある処理が必要です.ネット上の解決方法は基本的にステータスバーのViewを作成します.このViewの背景色を設定することによって、ステータスバーをシミュレートします.ここで3つの方法を試してみました.
方法1:方向 ConttentView 偽Viewを追加して、設定します. Child View のmargingTopプロパティは、fits System Windowsをシミュレートします.
フルスクリーンモード:
Window window = activity.getWindow();
ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);

//    ChildView      
View mChildView = mContentView.getChildAt(0);
if (mChildView != null) {
    ViewCompat.setFitsSystemWindows(mChildView, false);
}

int statusBarHeight = getStatusBarHeight(activity);
//       flag        
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//          ,      View
if (mChildView != null && mChildView.getLayoutParams() != null && mChildView.getLayoutParams().height == statusBarHeight) {
    //     View.
    mContentView.removeView(mChildView);
    mChildView = mContentView.getChildAt(0);
}
if (mChildView != null) {
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mChildView.getLayoutParams();
    //   ChildView   marginTop   
    if (lp != null && lp.topMargin >= statusBarHeight) {
        lp.topMargin -= statusBarHeight;
        mChildView.setLayoutParams(lp);
    }
}
カラーモード:
Window window = activity.getWindow();
ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);

//First translucent status bar.
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int statusBarHeight = getStatusBarHeight(activity);

View mChildView = mContentView.getChildAt(0);
if (mChildView != null) {
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mChildView.getLayoutParams();
    //      ChildView      marginTop,          
    if (lp != null && lp.topMargin  
  

2:  ContentParent  View ,  ContentView   ChildView  fitsSystemWindows.

:

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
ViewGroup mContentParent = (ViewGroup) mContentView.getParent();

View statusBarView = mContentParent.getChildAt(0);
if (statusBarView != null && statusBarView.getLayoutParams() != null && statusBarView.getLayoutParams().height == getStatusBarHeight(activity)) {
    //     View
    mContentParent.removeView(statusBarView);
}
//ContentView      
if (mContentParent.getChildAt(0) != null) {
    ViewCompat.setFitsSystemWindows(mContentParent.getChildAt(0), false);
}

//ChildView      
View mChildView = mContentView.getChildAt(0);
if (mChildView != null) {
    ViewCompat.setFitsSystemWindows(mChildView, false);
}
カラーモード( い がありますので、 できません):
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
ViewGroup mContentParent = (ViewGroup) mContentView.getParent();

View statusBarView = mContentParent.getChildAt(0);
if (statusBarView != null && statusBarView.getLayoutParams() != null && statusBarView.getLayoutParams().height == getStatusBarHeight(activity)) {
    //            View
    statusBarView.setBackgroundColor(statusColor);
    return;
}

//       View,      ContentParent
statusBarView = new View(activity);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        getStatusBarHeight(activity));
statusBarView.setBackgroundColor(statusColor);
mContentParent.addView(statusBarView, 0, lp);

//ChildView          
View mChildView = mContentView.getChildAt(0);
if (mChildView != null) {
    ViewCompat.setFitsSystemWindows(mChildView, false);
}
3:  ConttentView  Viewを して、 します. Child View のfits System Windowsです.
フルスクリーンモード:
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
View statusBarView = mContentView.getChildAt(0);
//     View
if (statusBarView != null && statusBarView.getLayoutParams() != null && statusBarView.getLayoutParams().height == getStatusBarHeight(activity)) {
    mContentView.removeView(statusBarView);
}
//     
if (mContentView.getChildAt(0) != null) {
    ViewCompat.setFitsSystemWindows(mContentView.getChildAt(0), false);
}
カラーモード:
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
int statusBarHeight = getStatusBarHeight(activity);

View mTopView = mContentView.getChildAt(0);
if (mTopView != null && mTopView.getLayoutParams() != null && mTopView.getLayoutParams().height == statusBarHeight) {
    //       View
    mTopView.setBackgroundColor(statusColor);
    return;
}
//  ChildView     
if (mTopView != null) {
    ViewCompat.setFitsSystemWindows(mTopView, true);
}

//    View
mTopView = new View(activity);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
mTopView.setBackgroundColor(statusColor);
mContentView.addView(mTopView, 0, lp);
はフルスクリーンモードは3つのモードで するのと じです. にカラーモードが います.
3つのカラーモードを して、
 
1
2
3

 ConttentView に Viewを して します. Child View のmargin Top を ってシミュレーションします. fits System Windows , にmargingTopの を することでフルスクリーンモードとカラーモードの で り えることができます.
なら パーティービュー の は つです Linear Layout , その にViewを することができます.
 ConttentView に Viewを し、ChildViewを する. の fits System Windows  で を しますが、 を するにはいつでも つのモードを り えることができません.

わりました Child View のmargin Top を します
モードでは、 バーによる のように い が れます.
Activityを しないでモードを り えることができません.
Github demoのコードに します.
Status BarComppat
Status BarComppat 1
Status BarComppat 2
め りをつける
Status Bar Comppat 2  な は り えることができません.Status Bar Comppat 1 4.4に い があります. できれば、これは りになる だと います.
SttusBar Comput クラスは が に した です. の はより です. を めます.
ユーザはいつでも じActivityで なるステータスバーモードを り えることができます.もし み したとしても dispatch Fit System Windows  もありません.
Androidクライアントを して、 のステータスバーを しました.シームレスに を えて、3 D の りメニューがあります.
ホームページ び りページのスクリーンショット
gank 1.png
び のスクリーンショット
ガッキー
github:GanK