事件分发机制

一.Activity的事件分发机制

当一个点击事件发生后,最先由Activity.dispatchTouchEvent()分发,接着是getWindow().superDispatchTouchEvent(),然后是mDecor.superDispatchTouchEvent()(即ViewGroup的dispatchTouchEvent()),从这里开始区分,
如果返回false直接走Activity.onTouchEvent(),无论这个方法返回什么,这个事件直接结束.
如果返回true,事件直接结束.

二.ViewGroup的事件分发机制

ViewGroup.dispatchTouchEvent(),然后调用ViewGroup的拦截方法onInterceptTouchEvent(),从这里开始区分
如果返回false(默认),那么事件会继续向子View传递,找到被点击的子View(通过for循环遍历ViewGroup的所有子View),调用子View的dispatchTouchEvent(),这就实现了ViewGroup的View的传递.
如果返回true或者无子View点击事件(点击空白)不允许事件继续向子View传递,然后调用super.dispatchTouchEvent(),自己处理事件,并调用自身的onTouch,接着是onTouchEvent(),performClick(),onClick().

三. View事件的分发机制
View.dispatchTouchEvent()只有满足三个条件时才会返回true
条件1.
mOnTouchListener != null 即mOnTouchListener变量在View.setOnTouchListener()方法里赋值
条件2:(mViewFlags & ENABLED_MASK) == ENABLED
a. 该条件是判断当前点击的控件是否enable
b. 由于很多View默认enable,故该条件恒定为true
条件3:mOnTouchListener.onTouch(this, event)
即 回调控件注册Touch事件时的onTouch()

若在onTouch()返回true,就会让上述三个条件全部成立,从而使得View.dispatchTouchEvent()直接返回true,事件分发结束
若在onTouch()返回false,就会使得上述三个条件不全部成立,从而使得View.dispatchTouchEvent()中跳出If,执行onTouchEvent(event)

每当控件被点击时调用View.dispatchTouchEvent(),再调用onTouch(),从这里区分
如果onTouch返回true,事件被消费,不会在向下传递,不调用onClick(),结束
如果onTouch返回false,事件继续向下传递调用onTouchEvent(),调用performClick(),onClick(),结束
注:onTouch先执行于onClick

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值