View.setSystemUiVisibility(int)參數(shù)詳解(圖)

在開發(fā)透明狀態(tài)欄的時候,會使用到這段代碼(來自郭霖的博客):

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
    View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    decorView.setSystemUiVisibility(option);
    getWindow().setNavigationBarColor(Color.TRANSPARENT);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

會用是知其然,但是要知其所以然。那么,這個setSystemUiVisibility方法傳入的這個參數(shù),到底起到什么作用呢?

  • SYSTEM_UI_FLAG_FULLSCREEN
    全屏模式,占據(jù)整個屏幕,隱藏狀態(tài)欄等界面,不過導航欄不會隱藏。如果用戶進行操作,隱藏的系統(tǒng)界面會立馬出現(xiàn)并清除該flag。

    SYSTEM_UI_FLAG_FULLSCREEN

  • SYSTEM_UI_FLAG_HIDE_NAVIGATION
    隱藏導航欄,布局會往下移。如果用戶進行操作,導航欄會立馬出現(xiàn)并清除該flag。

    SYSTEM_UI_FLAG_HIDE_NAVIGATION

  • SYSTEM_UI_FLAG_IMMERSIVE
    和SYSTEM_UI_FLAG_HIDE_NAVIGATION共同使用,使用戶操作不再顯示導航欄(但是仍能通過從底部往上滑調(diào)出并清除flag)。單獨使用無效。

  • SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    和SYSTEM_UI_FLAG_FULLSCREEN以及SYSTEM_UI_FLAG_HIDE_NAVIGATION共同使用。用戶操作不再清除flag,從邊緣滑入可以調(diào)出狀態(tài)欄和導航欄,并且過幾秒之后自動隱藏。單獨使用無效。

    SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN

  • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    不隱藏狀態(tài)欄和導航欄,但是app會按照已經(jīng)隱藏了那樣布局。也就是說,布局會頂上去(占滿屏幕),但是會被狀態(tài)欄/導航欄遮蓋住。


    可以看到,最下面那行字被遮住了
  • SYSTEM_UI_FLAG_LAYOUT_STABLE
    布局變的“穩(wěn)定”,在狀態(tài)欄或者導航欄變化的時候不會被頂上去或者頂下去了。
    事實上,當同時設(shè)置了SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE之后,效果相當于SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN。
  • SYSTEM_UI_FLAG_LOW_PROFILE
    使系統(tǒng)界面不那么“顯眼”,用于沉浸式體驗。會使狀態(tài)欄、導航欄等系統(tǒng)UI變暗。

回過頭再看開始的代碼

uper.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
    View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    decorView.setSystemUiVisibility(option);
    getWindow().setNavigationBarColor(Color.TRANSPARENT);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

在普通情況下,整個手機界面從上到下依次是:狀態(tài)欄、appUI、虛擬導航欄。當設(shè)置了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN兩個flag之后,實際上appUI已經(jīng)占到了整個屏幕,但是被狀態(tài)欄和導航欄覆蓋在下層。


圖示

這時,再設(shè)置狀態(tài)欄和導航欄的顏色為透明,即可實現(xiàn)透明狀態(tài)欄/沉浸式的效果了。當知道了這些flag的作用之后,要實現(xiàn)其他效果也是很輕松了。比如看視頻的時候,就可以設(shè)置SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN,就可以實現(xiàn)全屏沉浸式觀看的效果了。

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

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