1床佳、能夠造成SystemUI Flag被系統(tǒng)自動(dòng)清除的交互分類
- 觸摸屏幕的任何位置;
- 頂部下拉狀態(tài)欄治笨;
- 底部上拉導(dǎo)航欄;
- Window的變化(如:跳轉(zhuǎn)到其他頁面赤嚼、軟鍵盤的彈出)
2旷赖、SystemUI Flag 相關(guān)特性詳解
- 1、View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:(>=api16)
作用:隱藏系統(tǒng)的NavigationBar更卒。
但是用戶的任何操作都會(huì)清除這個(gè)Flag等孵,進(jìn)而導(dǎo)航欄自動(dòng)重新顯示起來。同時(shí)View.SYSTEM_UI_FLAG_FULLSCREEN也會(huì)被自動(dòng)清除逞壁,因此StatusBar也會(huì)同時(shí)顯示出來流济。 - 2、View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:(>=api16)
作用:不會(huì)隱藏導(dǎo)航欄腌闯,但是頁面布局會(huì)延伸到NavigationBar下面绳瘟,被NavigationBar遮擋。- 設(shè)置此Flag時(shí)姿骏,設(shè)置View的fitSystemWindows=true糖声,會(huì)給該View添加和NavigationBar高度相同的paddingBottom。
- 3、View.SYSTEM_UI_FLAG_FULLSCREEN:(>=api16)
作用:隱藏狀態(tài)欄蘸泻。
和WindowManager.LayoutParams.FLAG_FULLSCREEN有相同的展示效果琉苇。不同的在于,此flag一般用于暫時(shí)全屏的情形(如:閱讀應(yīng)用悦施、全屏視頻)并扇,如果需要一直停留在全屏狀態(tài),(如:游戲應(yīng)用)抡诞,使用WindowManager.LayoutParams.FLAG_FULLSCREEN則是更好的選擇穷蛹。
此Flag會(huì)因?yàn)楦鞣N的交互(如:跳轉(zhuǎn)到其他應(yīng)用,下拉StatusBar,彈出鍵盤)的發(fā)送而被系統(tǒng)清除昼汗。 - 4肴熏、View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:(>=api16)
作用:不會(huì)隱藏狀態(tài)欄,但是頁面布局會(huì)延伸到狀態(tài)欄下面顷窒,被statusBar遮擋蛙吏。- 設(shè)置此flag時(shí),設(shè)置View的fitSystemWindows=true鞋吉,會(huì)給該View添加和statusBar相同高度的paddingTop.
- 5鸦做、 View.SYSTEM_UI_FLAG_LAYOUT_STABLE:(>=api16)
作用:穩(wěn)定布局。
- 當(dāng)使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION時(shí)坯辩,此時(shí)如果給View添加fitSystemWindows=true馁龟,系統(tǒng)會(huì)自動(dòng)為View添加狀態(tài)欄高度的paddingTop和NavigationBar高度的paddingBottom,如果狀態(tài)欄或Navigationbar隱藏漆魔,則View的padding會(huì)變成0坷檩,視覺上會(huì)看到閃爍。如果配合View.SYSTEM_UI_FLAG_LAYOUT_STABLE使用改抡,即使?fàn)顟B(tài)欄或NavigationBar隱藏矢炼,View的padding依然不變,這就是穩(wěn)定布局的意思阿纤。- 當(dāng)使用SYSTEM_UI_FLAG_FULLSCREEN |SYSTEM_UI_FLAG_LAYOUT_STABLE時(shí)句灌,會(huì)隱藏狀態(tài)欄,但狀態(tài)欄所占的控件不會(huì)隱藏欠拾,只會(huì)變成白色胰锌。同時(shí)Activity頁面不會(huì)延伸到狀態(tài)欄下。若是加上SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN藐窄,View所在window的顯示范圍則會(huì)伸展到StatusBar所在的空間资昧。
- 6、View.SYSTEM_UI_FLAG_IMMERSIVE:(>=api19)
作用:避免某些用戶交互造成系統(tǒng)自動(dòng)清除全屏狀態(tài)荆忍。- View.SYSTEM_UI_FLAG_IMMERSIVE和View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY的使用主要是為了當(dāng)設(shè)置全屏模式時(shí)格带,避免某些用戶交互造成系統(tǒng)自動(dòng)清除全屏狀態(tài)撤缴。
- 當(dāng)使用View.SYSTEM_UI_FLAG_HIDE_NAVIGATION隱藏導(dǎo)航欄時(shí),配合此特性叽唱,只有第三屈呕、四種操作會(huì)導(dǎo)致導(dǎo)航欄的隱藏狀態(tài)被系統(tǒng)自動(dòng)清除;否則棺亭,任何交互都不會(huì)導(dǎo)致導(dǎo)航欄的隱藏狀態(tài)被系統(tǒng)自動(dòng)清除虎眨。
- 此標(biāo)識(shí)只有配合View.SYSTEM_UI_FLAG_HIDE_NAVIGATION才有作用。
- 7镶摘、View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY:(>=api19)
作用:避免某些用戶交互造成系統(tǒng)自動(dòng)清除全屏狀態(tài)专甩。同時(shí)Activity的部分內(nèi)容也因此被StatusBar覆蓋遮擋。- 用View.SYSTEM_UI_FLAG_HIDE_NAVIGATION隱藏導(dǎo)航欄钉稍,配合使用此Flag,只有用戶的第四種操作會(huì)導(dǎo)致狀態(tài)欄或(和)導(dǎo)航欄的隱藏狀態(tài)被系統(tǒng)自動(dòng)清除。否則任何交互都不會(huì)導(dǎo)致相應(yīng)狀態(tài)的清除棺耍。
- 此Flag只有配合SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_HIDE_NAVIGATION使用時(shí)才會(huì)起作用贡未。
3、WindowManager 相關(guān)特性詳解
- 1蒙袍、WindowMananger.FLAG_TRANSLUCENT_STATUS: (>=api16)
作用:- 設(shè)置半透明的狀態(tài)欄俊卤。不會(huì)因?yàn)橛脩舨僮鞫宄?/li>
- 設(shè)置此屬性,系統(tǒng)會(huì)自動(dòng)同時(shí)設(shè)置View.SYSTEM_UI_FLAG_LAYOUT_STABLE和View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN這兩個(gè)屬性害幅。
- 2消恍、WindowMananger.FLAG_FULLSCREEN:
作用:- 隱藏狀態(tài)欄。
- 使用此屬性為導(dǎo)致軟鍵盤的SOFT_INPUT_ADJUST_RESIZE的特性失效以现。 暫時(shí)沒遇到此問題狠怨。
- 3、WindowMananger.FLAG_TRANSLUCENT_NAVIGATION:
- 半透明NavigationBar,并且不會(huì)因用戶交互而被清除邑遏。
- 設(shè)置了此flag,系統(tǒng)會(huì)自動(dòng)設(shè)置View.SYSTEM_UI_FLAG_LAYOUT_STABLE和View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
最低版本支持:Android4.4 (api 19)
- 4佣赖、WindowMananger.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS:
- 用于為StatusBar和NavigationBar設(shè)置背景顏色。
- 原理:將StatusBar和NavigationBar設(shè)置為透明背景记盒,并且將StatusBar和NavigationBar所在空間設(shè)置為Window.getStatusBarColor() 和Window.getNavigationBarColor()方法獲得的顏色憎蛤。
最低版本支持:Android5.0 (api 21)。
我們給狀態(tài)欄和導(dǎo)航欄著色的方法如下:
getWindow().setStatusBarColor(Color.RED);
getWindow().setNavigationBarColor(Color.RED);
如果在styles中配置這個(gè)屬性android:windowDrawsSystemBarBackgrounds=false:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
會(huì)導(dǎo)致給狀態(tài)欄和導(dǎo)航欄著色失效纪吮。
再看另外一種場(chǎng)景:我們?cè)诮鉀QApp啟動(dòng)時(shí)的黑屏的問題的解決方案如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash</item>
<item name="android:windowFullscreen">true</item>
<!--不讓windowBackground延申到navigation bar區(qū)域-->
<!--<item name="android:windowDrawsSystemBarBackgrounds">false</item>-->
<!--適配Android P劉海屏-->
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
</resources>
很簡(jiǎn)單就是給window設(shè)置一個(gè)背景俩檬,但是在含有導(dǎo)航欄的手機(jī)來說,背景會(huì)被其遮擋碾盟。
圖中藍(lán)色框中的logo就是設(shè)置的背景棚辽,綠色框中l(wèi)ogo是頁面中的內(nèi)容。具體實(shí)現(xiàn)可以去看
Android Splash Screen最佳實(shí)踐巷疼,包含全面屏晚胡,劉海屏適配灵奖。很明顯的看出設(shè)置的背景被導(dǎo)航欄,遮擋了估盘,怎么解決呢瓷患?
可以設(shè)置屬性android:windowDrawsSystemBarBackgrounds=false。