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,systembar,statusbar,导航栏,状态栏)