Android事件分发浅析及设计模式

android中的事件分发,简单来说就是 dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。 我们先看看官方文档的说明:

boolean dispatchTouchEvent (MotionEvent ev)

向下传递屏幕的触摸事件给目标视图,如果自己是目标视图责传递给自己。返回值True:如果事件被当前视图处理;false:没有处理,责不会接收到后面的消息。

boolean onInterceptTouchEvent (MotionEvent ev)

执行该方法来截断数模事件。消息会按照以下顺序接收:

  1. 先收到down消息。
  2. down消息可以被子view处理,也可以给自己的onTouchEvent处理。如果自己的onTouchEvent处理了,那么返回true,这个时候会继续收到后面的消息。同样的,如果onTouchEvent返回true,onInterceptTouchEvent就不会收到后面消息,而是在onTouchEvent中收到。
  3. 只要onInterceptTouchEvent返回false,那么所有接下来的消息都会先传递到这,然后传递给目标视图。
  4. 如果返回true,这里不会再接收到任何剩下的消息:所有的消息都会在onTouchEvent中接收,并且目标View会接收到 ACTION_CANCEL消息。(只有目标view在当前手势中收到过down才会收到cancel消息,具体见后面的总结)。 ####boolean onTouchEvent (MotionEventevent) 执行该方法来处理触摸事件。True:事件被处理 , false :不处理。

总结来说: onTouchEvent是最终处理事件的地方。

如果父viewgroup和子view同时有触摸事件的监听,父viewgroup的 dispatchTouchEvent 返回false,则子view和父viewgroup都不会再收到后面的消息了。

如果父viewgroup的onInterceptTouchEvent返回true 则消息交给父layout的onTouchEvent处理,父viewgroup的onInterceptTouchEvent不会收到消息,子view也不会收到任何消息;false则交给子view的onTouchEvent去处理,父viewgroup的onInterceptTouchEvent,任然会收到消息。

如果子view的onTouchEvent 返回false,则会在父viewgroup的onTouchEvent处理。

另外父viewgroup 不拦截第一个down事件,拦截后续事件的时候,子view才会收到cancel事件。

关于使用到设计模式,模板模式

模板模式,按照固定的流程,让用户去重写实现自己的方法。

责任链模式,父viewgroup把消息传递给子viewgroup,如果对象不能处理再这样一层层传递消息。

转载于:https://juejin.im/post/5c8752516fb9a049d9760b06

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值