許多內(nèi)容我們使用全屏展示時(shí)會(huì)得到更好的體驗(yàn)叼耙,如“游戲”腕窥,“視頻”粒没,“圖片”筛婉,“書籍”,“幻燈片”。
當(dāng)你使用全屏模式最大化屏幕的應(yīng)用空間時(shí)爽撒,一定要注意用戶可能的跳出檢查系統(tǒng)通知入蛆,或者進(jìn)行快速搜索的頻率。當(dāng)開啟全屏模式時(shí)硕勿,會(huì)導(dǎo)致用戶無(wú)法迅速使用系統(tǒng)導(dǎo)航哨毁,所以當(dāng)用戶體驗(yàn)的好處大于額外操作的可能時(shí),我們才使用全屏模式源武。
實(shí)現(xiàn)全屏3種操作:
1.Lean back傾斜模式
Lean back多用于觀看視頻時(shí)扼褪,當(dāng)用戶想要恢復(fù)系統(tǒng)欄時(shí),只需要點(diǎn)擊屏幕粱栖。
調(diào)用setSystemUiVisibility()傳遞SYSTEM_UI_FLAG_FULLSCREEN?andSYSTEM_UI_FLAG_HIDE_NAVIGATION.话浇,當(dāng)系統(tǒng)欄顯示時(shí)會(huì)接收到一個(gè)回調(diào),用于更新UI闹究,參考Responding to UI Visibility Changes
2.Immersive沉浸式模式
用于用戶需要大量屏幕操作幔崖,如“游戲”,“圖片觀看”渣淤,“書籍閱讀”赏寇,“幻燈片演示”。當(dāng)用戶需要系統(tǒng)欄時(shí)价认,只需要從隱藏系統(tǒng)欄的邊緣滑動(dòng)就可以嗅定,而不需要擔(dān)心其他屏幕操作用踩,影響用戶體驗(yàn)露戒。
調(diào)用setSystemUiVisibility()傳遞SYSTEM_UI_FLAG_IMMERSIVE?配置選項(xiàng)?SYSTEM_UI_FLAG_FULLSCREEN?andSYSTEM_UI_FLAG_HIDE_NAVIGATION
這種模式同樣用于,有自己的控件也需要與系統(tǒng)欄同步顯示或隱藏捶箱。例如觸摸屏幕上的任何位置切換工具欄或調(diào)色板的外觀丁屎,那么它還應(yīng)切換系統(tǒng)欄的外觀晨川。
3.Sticky immersive粘性沉浸式模式
常規(guī)沉浸式愧怜,當(dāng)滑動(dòng)屏幕邊緣時(shí)拥坛,系統(tǒng)都會(huì)負(fù)責(zé)顯示系統(tǒng)欄丸氛,而應(yīng)用程序卻無(wú)法獲得手勢(shì)操作事件,對(duì)于頻繁需要滑動(dòng)的游戲應(yīng)用來說摹察,這部分的體驗(yàn)就會(huì)非常糟糕螃成,所以應(yīng)該使用Sticky immersive偿曙。
在粘性沉浸式模式下,如果用戶使用系統(tǒng)欄從邊緣滑動(dòng),系統(tǒng)欄會(huì)出現(xiàn)稿壁,但它們是半透明的龟再,并且觸摸手勢(shì)會(huì)傳遞到您的應(yīng)用程序蛉威,因此應(yīng)用程序也可以響應(yīng)手勢(shì)。
在使用此方法的繪圖應(yīng)用程序中课竣,如果用戶想要繪制從屏幕最邊緣開始的線條公条,則從邊緣滑動(dòng)會(huì)顯示系統(tǒng)條欄并開始繪制從邊緣開始的線條。幾秒鐘沒有交互后迂曲,或者一旦用戶觸摸或手勢(shì)在系統(tǒng)欄外的任何位置赃份,系統(tǒng)欄會(huì)自動(dòng)消失
調(diào)用setSystemUiVisibility()傳遞SYSTEM_UI_FLAG_IMMERSIVE_STICKY配置選項(xiàng)?SYSTEM_UI_FLAG_FULLSCREEN?andSYSTEM_UI_FLAG_HIDE_NAVIGATION
UI標(biāo)簽除了,還有SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION?和SYSTEM_UI_FLAG_LAYOUT_STABLE奢米。為防止當(dāng)系統(tǒng)欄隱藏或顯示時(shí)影響應(yīng)用布局調(diào)整大小抓韩。 您還應(yīng)確保同時(shí)隱藏操作欄和其他UI控件。
@Override
public void onWindowFocusChanged(boolean hasFocus) { ? ?
????super.onWindowFocusChanged(hasFocus); ? ?
????if (hasFocus) { ? ? ? ?
????????hideSystemUI(); ? ?
????}
}
private void hideSystemUI() { ? ?
????//使用常規(guī)immersive模式鬓长,SYSTEM_UI_FLAG_IMMERSIVE? ? ?
????//使用 "lean back" 模式谒拴,移除 SYSTEM_UI_FLAG_IMMERSIVE. ? ?
????//"sticky immersive"模式, SYSTEM_UI_FLAG_IMMERSIVE_STICKY ? ?
????View decorView = getWindow().getDecorView(); ? ?
????decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE? ? ? ? ? ?
????// 設(shè)置內(nèi)容顯示在系統(tǒng)欄之下涉波,系統(tǒng)欄顯示或者隱藏英上,內(nèi)容大小不發(fā)生變化
????| ????View.SYSTEM_UI_FLAG_LAYOUT_STABLE ? ? ? ? ? ?
????| ????View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ? ? ? ? ? ?
????| ????View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ? ? ? ? ? ?
????// 隱藏導(dǎo)航欄和狀態(tài)欄? ? ? ? ? ?
????| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ? ? ? ? ? ?
????| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
// 顯示所有系統(tǒng)欄只需要移除除了用于設(shè)置內(nèi)容顯示在系統(tǒng)欄之下的標(biāo)簽即可炭序。
private void showSystemUI() { ? ?
????View decorView = getWindow().getDecorView(); ? ?
????decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE? ? ? ? ? ??
? ? | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ? ? ? ? ? ?
????| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
更好的用戶體驗(yàn):
1.要在狀態(tài)之間提供無(wú)縫轉(zhuǎn)換,請(qǐng)保持所有UI控件的可見性與系統(tǒng)欄同步苍日。 應(yīng)用程序進(jìn)入沉浸式模式后惭聂,任何UI控件也應(yīng)與系統(tǒng)欄一起隱藏,然后在系統(tǒng)UI重新出現(xiàn)時(shí)再次出現(xiàn)相恃。繼承View.OnSystemUiVisibilityChangeListener接收回調(diào)辜纲,參考Responding to UI Visibility Changes
2.繼承onWindowFocusChanged(),如果您獲得了窗口焦點(diǎn)拦耐,您可能需要重新隱藏系統(tǒng)欄耕腾。 如果您失去了窗口焦點(diǎn),例如由于顯示在您的應(yīng)用上方的對(duì)話框或彈出菜單杀糯,您可能希望取消之前使用Handler.postDelayed或類似內(nèi)容安排的任何待處理“隱藏”操作扫俺。
3.繼承GestureDetector,來監(jiān)聽onSingleTapUp(MotionEvent)以便控制觸摸內(nèi)容區(qū)域來顯示或隱藏系統(tǒng)欄固翰。