Android的触摸事件传递分析

Android的触摸事件传递分析


Android的触摸事件总是传递到Activity的根视图DecorView,DecorView再进行分发。
在一组连续的触摸事件中, MotionEvent.ACTION_DOWN代表TouchEvent的开始,传递进DecorView.dispatchTouchEvent,并且后续的所有MotionEvent都将传递进DecorView.dispatchTouchEvent来分发。DecorView.dispatchTouchEvent实际上调用父类ViewGroup的dispatchTouchEvent方法。

知识点一、ViewGroup对MotionEvent.ACTION_DOWN事件的处理可如下描述:

  1. ViewGroup.dispatchTouchEvent将调用onInterceptTouchEvent试图拦截MotionEvent.ACTION_DOWN,拦截成功的话进入步骤3,否则进入步骤2;
  2. ViewGroup.dispatchTouchEvent根据MotionEvent.ACTION_DOWN的位置遍历子控件view children,并把MotionEvent.ACTION_DOWN传递给childView的View.dispatchTouchEvent。如果有childView的View.dispatchTouchEvent返回true那这个childView就被记为TouchTarget,ViewGroup.dispatchTouchEvent也返回true。如果没有找到TouchTarget,则进入步骤3;
  3. ViewGroup.dispatchTouchEventMotionEvent.ACTION_DOWN传递给父类View的View.dispatchTouchEvent,并返回View.dispatchTouchEvent的返回值。

知识点二、DecorView对MotionEvent.ACTION_DOWN事件的处理:

DecorView对MotionEvent.ACTION_DOWN的处理过程基本就是上述3个步骤,实际的处理结果如下:

  1. 由于DecorView是根视图只负责触摸事件分发,上述步骤1总是失败而步骤3总是返回false。
  2. 如果步骤2没有找到TouchTarget,那后续的MotionEvent.ACTION_MOVE、MotionEvent.ACTION_UP、MotionEvent.ACTION_CANCEL只会传递到DecorView.dispatchTouchEvent并且不会再分发。
  3. 如果步骤2找到TouchTarget,那后续的MotionEvent都会传递到这个TouchTarget。

三、MotionEvent.ACTION_DOWN事件在DecorView内View和ViewGroup的传递过程分析:

基于以上两点,MotionEvent.ACTION_DOWN事件实际上是在DecorView内的View和ViewGroup传递,我们把知识点一步骤2遍历view children过程中的子控件记为PotentialTarget,那么知识点一步骤2可以分解成:

  1. 如果PotentialTarget是ViewGroup的子类,那么PotentialTarget的dispatchTouchEvent将重复知识点一的3个步骤,否则进入步骤2;
  2. PotentialTarget的dispatchTouchEvent返回onTouchEvent的返回值;

四、MotionEvent.ACTION_DOWN之后的触摸事件在DecorView内View和ViewGroup的传递过程分析:

(To be done)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值