沉浸式狀態欄

狀態欄透明方法:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    或

  <item name="android:windowTranslucentStatus">true</item>

第一種方法是在代碼中設置,在setContentView()之前設置。

第二種方法在Activity的主題Theme文件中設置。

這兩種方法更多的用戶4.4版本的沉浸式狀態欄效果,其主要是將狀態欄的顏色設置爲透明,自動將當前窗口內的佈局整體上移一個statusbar的高度。所以,在4.4版本上做沉浸式,需要單獨增加一個狀態欄高度的view,用來佔位。但是這種思路的方案在6.0上也能夠實現。有兩種方案:

方案一

private void sinkStatusBar1() {
        // 在4.4開始,通過設置windowTranslucentStatus來透明話狀態欄
        // 或者在style中通過設置"android:windowTranslucentStatus"爲true來設置
        // 但是,僅僅設置該屬性, 應用標題欄和狀態欄重疊了,相當於整個佈局上移了StatusBar的高度。
        // 下屬方案是直接在content佈局部分頂部增加一個佔位組件,高度與statusbar高度相同
        // 6.0上也可直接運行
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        ViewGroup rootView =
                (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
        int count = rootView.getChildCount();
        //判斷是否已經添加了statusBarView
        if (count > 0 && rootView.getChildAt(0) instanceof FakeStatusBarView) {
            rootView.getChildAt(0).setBackgroundColor(calculateStatusBarColor());
        } else {
            FakeStatusBarView statusBarView = createFakeStatusBar();
            rootView.addView(statusBarView, 0);
        }
//        }
    }

方案二

private void sinkStatusBar2() {
        // 在4.4開始,通過設置windowTranslucentStatus來透明話狀態欄
        // 或者在style中通過設置"android:windowTranslucentStatus"爲true來設置
        // 但是,僅僅設置該屬性, 應用標題欄和狀態欄重疊了,相當於整個佈局上移了StatusBar的高度。
        // 下述方案是直接在DecorView佈局部分最後增加一個佔位組件,高度與statusbar高度相同
        // 6.0上也可直接運行
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //獲取windowphone下的decorView
        ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
        int       count     = decorView.getChildCount();
        //判斷是否已經添加了statusBarView
        if (count > 0 && decorView.getChildAt(count - 1) instanceof FakeStatusBarView) {
            decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusBarColor());
        } else {
            //新建一個和狀態欄高寬的view
            FakeStatusBarView statusView = createFakeStatusBar();
            decorView.addView(statusView);
        }
        ViewGroup rootView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
        //rootview不會爲狀態欄留出狀態欄空間
        ViewCompat.setFitsSystemWindows(rootView,true);
        rootView.setClipToPadding(true);
//        }
    }
兩種方案的區別,一個是在DecorView節點下增加一個佔位View。而方案一是直接在DecorView的content佈局節點內增加一個佔位View。


發佈了7 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章