2019重新Android回顾 UI控制之全屏篇
许多内容我们使用全屏展示时会得到更好的体验,如“游戏”,“视频”,“图片”,“书籍”,“幻灯片”。
当你使用全屏模式最大化屏幕的应用空间时,一定要注意用户可能的跳出检查系统通知,或者进行快速搜索的频率。当开启全屏模式时,会导致用户无法迅速使用系统导航,所以当用户体验的好处大于额外操作的可能时,我们才使用全屏模式。
实现全屏3种操作:
1.Lean back倾斜模式
Lean back多用于观看视频时,当用户想要恢复系统栏时,只需要点击屏幕。
调用setSystemUiVisibility()传递SYSTEM_UI_FLAG_FULLSCREEN andSYSTEM_UI_FLAG_HIDE_NAVIGATION.,当系统栏显示时会接收到一个回调,用于更新UI,参考Responding to UI Visibility Changes
2.Immersive沉浸式模式
用于用户需要大量屏幕操作,如“游戏”,“图片观看”,“书籍阅读”,“幻灯片演示”。当用户需要系统栏时,只需要从隐藏系统栏的边缘滑动就可以,而不需要担心其他屏幕操作,影响用户体验。
调用setSystemUiVisibility()传递SYSTEM_UI_FLAG_IMMERSIVE 配置选项 SYSTEM_UI_FLAG_FULLSCREEN andSYSTEM_UI_FLAG_HIDE_NAVIGATION
这种模式同样用于,有自己的控件也需要与系统栏同步显示或隐藏。例如触摸屏幕上的任何位置切换工具栏或调色板的外观,那么它还应切换系统栏的外观。
3.Sticky immersive粘性沉浸式模式
常规沉浸式,当滑动屏幕边缘时,系统都会负责显示系统栏,而应用程序却无法获得手势操作事件,对于频繁需要滑动的游戏应用来说,这部分的体验就会非常糟糕,所以应该使用Sticky immersive。
在粘性沉浸式模式下,如果用户使用系统栏从边缘滑动,系统栏会出现,但它们是半透明的,并且触摸手势会传递到您的应用程序,因此应用程序也可以响应手势。
在使用此方法的绘图应用程序中,如果用户想要绘制从屏幕最边缘开始的线条,则从边缘滑动会显示系统条栏并开始绘制从边缘开始的线条。几秒钟没有交互后,或者一旦用户触摸或手势在系统栏外的任何位置,系统栏会自动消失
调用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。为防止当系统栏隐藏或显示时影响应用布局调整大小。 您还应确保同时隐藏操作栏和其他UI控件。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
hideSystemUI();
}
}
private void hideSystemUI() {
//使用常规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
// 设置内容显示在系统栏之下,系统栏显示或者隐藏,内容大小不发生变化
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// 隐藏导航栏和状态栏
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
// 显示所有系统栏只需要移除除了用于设置内容显示在系统栏之下的标签即可。
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.要在状态之间提供无缝转换,请保持所有UI控件的可见性与系统栏同步。 应用程序进入沉浸式模式后,任何UI控件也应与系统栏一起隐藏,然后在系统UI重新出现时再次出现。继承View.OnSystemUiVisibilityChangeListener接收回调,参考Responding to UI Visibility Changes
2.继承onWindowFocusChanged(),如果您获得了窗口焦点,您可能需要重新隐藏系统栏。 如果您失去了窗口焦点,例如由于显示在您的应用上方的对话框或弹出菜单,您可能希望取消之前使用Handler.postDelayed或类似内容安排的任何待处理“隐藏”操作。
3.继承GestureDetector,来监听onSingleTapUp(MotionEvent)以便控制触摸内容区域来显示或隐藏系统栏。