在開發(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)全屏沉浸式觀看的效果了。



