Android事件分发机制大解析(附带完整分析源码)

这里有完整代码,源码下载

图解因为看不见画图的先后顺序,不容易体会思路,我就不上图了。

先指出事件分发的三个方法


dispatch 英文释义  派遣,调度,我们可以理解为分发。
事件一:dispatchTouchEvent   分发    


Intercept  英文释义   截距; 截击,拦截; 截听; 拦截者;中断
事件二:onInterceptTouchEvent   拦截


事件三:onTouchEvent    处理

它们的返回值都是boolean.我们先不说理论,直接写代码做实验,用实验结果说话

如上图所示,布局大概就是activity中最外层viewgroupA,它包裹viewgroupB, b里面有个view.

Override上述三个方法,里面啥都不干,只打印日志。(ps:activity和view是没有onInterceptTouchEvent方法的,很好理解,activity拦截事件给谁消费呢?view是责任链的最后一层,自然也不用拦截事件)

实验一:

1.复写各自上述三个方法,里面啥都不干。因为涉及到多个事件,所以我们只在down事件发生时,打印日志。

2.点击view,查看日志打印

如上图,事件分发大概就是一个责任链的模式。

第一阶段:先走activity的向下“分发”,到viewgroup的“分发”,再到viewgroup特有的方法“是否拦截”,以此类推,再走下层viewgroup的“分发”,再走下层viewgroup的“是否拦截”,再到view的“分发”

第二阶段:走view的“处理”,再走viewgroupB的“处理”,再走viewGroupA的“处理”,再走activity的“处理”

问题:那么问题来了,假设在第一阶段中的,“分发”方法dispatchTouchEvent中返回true,该当如何?

实验二:

1.将viewGroupB的“分发”事件返回true.其他不变

2.点击view,查看日志

由上可看,事件在第一阶段即中止,中止于viewGroupB的“分发”阶段

问题:假设在第一阶段中的,“是否拦截”方法onInterceptTouchEvent中返回true,该当如何?

实验三:

1.将viewGroupB的“是否拦截”事件返回true.其他不变

2.点击view,查看日志

由上图可看,事件没有被中断,同样也是一个责任链,只不过没有走到view那一层。

第一阶段:先走activity的向下“分发”,到viewgroup的“分发”,再到viewgroup特有的方法“是否拦截”,以此类推,再走下层viewgroup的“分发”,再走下层viewgroup的“是否拦截”,拦截了,就自己处理

第二阶段:走viewgroupB自己的“处理”,再走viewGroupA的“处理”,再走activity的“处理”

问题:如果在“处理”方法中返回true,又该当如何呢?

实验四:

1.将viewGroupB的“处理”事件返回true.其他不变

2.点击view,查看日志

看图,责任链的第一阶段,是完全没有变化的。第二阶段,止步于自己的“处理”方法

第一阶段:先走activity的向下“分发”,到viewgroup的“分发”,再到viewgroup特有的方法“是否拦截”,以此类推,再走下层viewgroup的“分发”,再走下层viewgroup的“是否拦截”,再到view的“分发”

第二阶段:走view的“处理”,再走viewgroupB自己的的“处理”,事件中止。

 

这里有完整代码,源码下载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值