android中的事件分发,简单来说就是 dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。
我们先看看官方文档的说明:
boolean dispatchTouchEvent (MotionEvent ev)
向下传递屏幕的触摸事件给目标视图,如果自己是目标视图责传递给自己。返回值True:如果事件被当前视图处理;false:没有处理,责不会接收到后面的消息。
boolean onInterceptTouchEvent (MotionEvent ev)
执行该方法来截断数模事件。消息会按照以下顺序接收:
- 先收到down消息。
- down消息可以被子view处理,也可以给自己的onTouchEvent处理。如果自己的onTouchEvent处理了,那么返回true,这个时候会继续收到后面的消息。同样的,如果onTouchEvent返回true,onInterceptTouchEvent就不会收到后面消息,而是在onTouchEvent中收到。
- 只要onInterceptTouchEvent返回false,那么所有接下来的消息都会先传递到这,然后传递给目标视图。
- 如果返回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,如果对象不能处理再这样一层层传递消息。
网友评论