Android 响应System UI状态,焦点改变,手势处理

Android SystemBar各种风格案例

响应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

参考资源

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值