Status Bar和Navigation Bar的顯示與隱藏

實(shí)現(xiàn)仿微信查看大圖的時(shí)候StatusBar和NavigationBar的狀態(tài)變化

兩篇不錯(cuò)的關(guān)于這兩個(gè)Bar狀態(tài)的文章:

1.http://angeldevil.me/2014/09/02/About-Status-Bar-and-Navigation-Bar/
2.http://vitiy.info/small-guide-how-to-support-immersive-mode-under-android-4-4/
3.http://developer.android.com/training/system-ui/immersive.html

//得到contentView的父布局,是一個(gè)FrameLayout
rootContent = (ViewGroup) findViewById(android.R.id.content);
//add 大圖控件到 rootContent
root.addView(bview);

System UI的顯示和隱藏通過(guò)下面兩個(gè)函數(shù)實(shí)現(xiàn)。在hideSystemUI()方法中,通過(guò)SYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_FULLSCREEN來(lái)隱藏Status Bar,讓Activity的UI占滿全屏(不會(huì)占據(jù)Navigation Bar的空間),通過(guò)SYSTEM_UI_FLAG_IMMERSIVE_STICKY模式,使得系統(tǒng)以半透明方法顯示System UI方便用戶操作,并會(huì)在一段時(shí)間后自動(dòng)隱藏,此時(shí)并不會(huì)引起onSystemUiVibilityChanged的調(diào)用.

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void hideSystemUI() {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }

showSystemUI()方法中,通過(guò)SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN使得Activity的UI占據(jù)全屏,但是這個(gè)時(shí)候Status Bar和Navigation Bar都沒(méi)有被隱藏,所以Status Bar會(huì)遮擋住Activity UI的部分空間。解決辦法就是給ContentView設(shè)置fitSystemWindows為true。這樣系統(tǒng)會(huì)把被Status Bar遮擋住的區(qū)域自動(dòng)轉(zhuǎn)化成Activity UI的內(nèi)邊距,這樣被StatusBar遮擋的問(wèn)題就得到了解決。

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void showSystemUI() {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }

但是當(dāng)Window的焦點(diǎn)發(fā)生變化的時(shí)候,SYSTEM_UI_FLAG_IMMERSIVE_STICKY就會(huì)失效,Status Bar會(huì)重新出現(xiàn),并且不是透明的??梢员O(jiān)聽(tīng)onWindowFocusChanged事件來(lái)重新調(diào)用hideSystemUI()方法。

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && hasView) {
            mPhotoView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    hideSystemUI();
                }
            }, 500);

        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 通常來(lái)說(shuō),System bars(包含status bar和navigation bar,如下圖所示, 1代...
    小蕓論閱讀 4,121評(píng)論 0 9
  • 實(shí)現(xiàn)輔助(外掛)參考地址:http://developer.android.com/training/access...
    AFinalStone閱讀 1,524評(píng)論 0 0
  • 何謂沉浸式狀態(tài)欄## 說(shuō)白了,沉浸式狀態(tài)欄本質(zhì)上就是給系統(tǒng)狀態(tài)欄著色。當(dāng)這個(gè)顏色和我們Activity中的Tool...
    chandarlee閱讀 15,908評(píng)論 2 54
  • //定義轉(zhuǎn)換函數(shù)function dateConvert(dateParms){// 對(duì)傳入的時(shí)間參數(shù)進(jìn)行判斷if...
    周萌萌閱讀 921評(píng)論 2 0

友情鏈接更多精彩內(nèi)容