Android 响应System UI状态,焦点改变,手势处理
Android SystemBar各种风格案例:
Android System Bar(Status Bar 和Navigation Bar)暗淡效果
Android Status Bar的隐藏与浮层效果
Android NavigationBar隐藏与浮层
Android SystemBar(Status Bar 和Navigation Bar)设置 Immersive与Sticky Immersion风格
Android 响应System UI状态,焦点改变,手势处理
响应System UI状态,焦点改变,手势处理:
System Bar 状态显示的处理方式:
为了监听System bar 状态变化,需在Activity类中onCreate()方法中注册View.OnSystemUiVisibilityChangeListener 去监听。
class MainActivity : AppCompatActivity(), View.OnClickListener { private var tag = MainActivity::class.java.simpleName override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSystemUIChangeListener() } /** * 监听System bar异步改变 */ fun setSystemUIChangeListener() { /** * 当 system bar 设置LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags,才会触发 */ window.decorView.setOnSystemUiVisibilityChangeListener { visibility -> if ((visibility and View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {// system bar可见 //再次隐藏SystemBar SystemUIManager.setStickyStyle(window) Toast.makeText(applicationContext, " system bar 显示出来", Toast.LENGTH_SHORT).show() } else {// system bar不可见 Toast.makeText(applicationContext, " system bar被隐藏", Toast.LENGTH_SHORT).show() } } }}
Window 焦点改变的处理方式:
当焦点发生改变的时候(dialog弹出或者一些其他动作),隐藏的system bar会重新出现。若是onCreate()执行隐藏的system bar的代码,按Home键退出,重新进入的时候,不会再走onCreate(),而最好的处理方式是在onResume()或者onWindowFocusChanged()进行隐藏。
/** * 当焦点占据时候,隐藏system bar. */ override fun onWindowFocusChanged(hasFocus: Boolean) { SystemUIManager.setStickyStyle(window) super.onWindowFocusChanged(hasFocus) }
一些特殊的手势处理:
通过GestureDetector来处理手势,当触摸屏幕:手指落下,且抬起,不滑动,会触发onSingleTapUp(),则进行判断SystemBar是否显示出来
/** * 手势处理类 */ lateinit var gestureDetector: GestureDetector /** * 添加手势处理 */ fun setGestureHandler() { //创建一个 Gesture Detector来处理onTouch()中信息。 gestureDetector = GestureDetector(this.applicationContext, object : GestureDetector.SimpleOnGestureListener() { override fun onSingleTapUp(e: MotionEvent): Boolean { var visible= (window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)==0 if (visible){//单击导致SystemBar可见,则进行隐藏 showToast("onSingleTapUp响应: 触摸屏幕system bar 显示出来,进行再次隐藏") SystemUIManager.setStickyStyle(window) } return true } }) gestureDetector.setIsLongpressEnabled(false) }
了解了一系列的System bar各种使用情况。
总结以下模式适合哪种类型的App:
视频类型APP采用的模式:FullScreen+Hide_navigation
阅读器类型App采用的模式: Immersive+fullScreen+Hide_Navigation
游戏类型App采用的模式: Immersive_Sticky+FullScreen+Hide_Navigation
本项目案例:https://github.com/13767004362/ManageSystemUIDemo
参考资源:
- 官方介绍:https://developer.android.google.cn/training/system-ui/index.html
更多相关文章
- 监听android电话呼叫状态
- Android获取通话状态
- Android USB状态监控(解决scheme="file")
- Android - GridView,自定义开关控件,状态选择器selector,自定义对话
- Android如何使布局中图(ImageButton)和文字(TextView)同时获得press
- 《Android/OPhone开发完全讲义》连载(5):Notification与状态栏信息
- Android selector 状态选择器
- Android selector状态选择器的使用详解
- Android焦点分发基本流程