許多內容我們使用全屏展示時會得到更好的體驗,如“游戲”,“視頻”,“圖片”,“書籍”,“幻燈片”。
當你使用全屏模式最大化屏幕的應用空間時,一定要注意用戶可能的跳出檢查系統(tǒng)通知,或者進行快速搜索的頻率。當開啟全屏模式時,會導致用戶無法迅速使用系統(tǒng)導航,所以當用戶體驗的好處大于額外操作的可能時,我們才使用全屏模式。
實現全屏3種操作:
1.Lean back傾斜模式
Lean back多用于觀看視頻時,當用戶想要恢復系統(tǒng)欄時,只需要點擊屏幕。
調用setSystemUiVisibility()傳遞SYSTEM_UI_FLAG_FULLSCREEN?andSYSTEM_UI_FLAG_HIDE_NAVIGATION.,當系統(tǒng)欄顯示時會接收到一個回調,用于更新UI,參考Responding to UI Visibility Changes
2.Immersive沉浸式模式
用于用戶需要大量屏幕操作,如“游戲”,“圖片觀看”,“書籍閱讀”,“幻燈片演示”。當用戶需要系統(tǒng)欄時,只需要從隱藏系統(tǒng)欄的邊緣滑動就可以,而不需要擔心其他屏幕操作,影響用戶體驗。
調用setSystemUiVisibility()傳遞SYSTEM_UI_FLAG_IMMERSIVE?配置選項?SYSTEM_UI_FLAG_FULLSCREEN?andSYSTEM_UI_FLAG_HIDE_NAVIGATION
這種模式同樣用于,有自己的控件也需要與系統(tǒng)欄同步顯示或隱藏。例如觸摸屏幕上的任何位置切換工具欄或調色板的外觀,那么它還應切換系統(tǒng)欄的外觀。
3.Sticky immersive粘性沉浸式模式
常規(guī)沉浸式,當滑動屏幕邊緣時,系統(tǒng)都會負責顯示系統(tǒng)欄,而應用程序卻無法獲得手勢操作事件,對于頻繁需要滑動的游戲應用來說,這部分的體驗就會非常糟糕,所以應該使用Sticky immersive。
在粘性沉浸式模式下,如果用戶使用系統(tǒng)欄從邊緣滑動,系統(tǒng)欄會出現,但它們是半透明的,并且觸摸手勢會傳遞到您的應用程序,因此應用程序也可以響應手勢。
在使用此方法的繪圖應用程序中,如果用戶想要繪制從屏幕最邊緣開始的線條,則從邊緣滑動會顯示系統(tǒng)條欄并開始繪制從邊緣開始的線條。幾秒鐘沒有交互后,或者一旦用戶觸摸或手勢在系統(tǒng)欄外的任何位置,系統(tǒng)欄會自動消失
調用setSystemUiVisibility()傳遞SYSTEM_UI_FLAG_IMMERSIVE_STICKY配置選項?SYSTEM_UI_FLAG_FULLSCREEN?andSYSTEM_UI_FLAG_HIDE_NAVIGATION
UI標簽除了,還有SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION?和SYSTEM_UI_FLAG_LAYOUT_STABLE。為防止當系統(tǒng)欄隱藏或顯示時影響應用布局調整大小。 您還應確保同時隱藏操作欄和其他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? ? ? ? ? ?
????// 設置內容顯示在系統(tǒng)欄之下,系統(tǒng)欄顯示或者隱藏,內容大小不發(fā)生變化
????| ????View.SYSTEM_UI_FLAG_LAYOUT_STABLE ? ? ? ? ? ?
????| ????View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ? ? ? ? ? ?
????| ????View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ? ? ? ? ? ?
????// 隱藏導航欄和狀態(tài)欄? ? ? ? ? ?
????| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ? ? ? ? ? ?
????| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
// 顯示所有系統(tǒng)欄只需要移除除了用于設置內容顯示在系統(tǒng)欄之下的標簽即可。
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);
}
更好的用戶體驗:
1.要在狀態(tài)之間提供無縫轉換,請保持所有UI控件的可見性與系統(tǒng)欄同步。 應用程序進入沉浸式模式后,任何UI控件也應與系統(tǒng)欄一起隱藏,然后在系統(tǒng)UI重新出現時再次出現。繼承View.OnSystemUiVisibilityChangeListener接收回調,參考Responding to UI Visibility Changes
2.繼承onWindowFocusChanged(),如果您獲得了窗口焦點,您可能需要重新隱藏系統(tǒng)欄。 如果您失去了窗口焦點,例如由于顯示在您的應用上方的對話框或彈出菜單,您可能希望取消之前使用Handler.postDelayed或類似內容安排的任何待處理“隱藏”操作。
3.繼承GestureDetector,來監(jiān)聽onSingleTapUp(MotionEvent)以便控制觸摸內容區(qū)域來顯示或隱藏系統(tǒng)欄。