美文网首页
Android事件分发浅析及设计模式

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

作者: 卜卜Bruce | 来源:发表于2018-03-26 23:36 被阅读0次

    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,如果对象不能处理再这样一层层传递消息。

    相关文章

      网友评论

          本文标题:Android事件分发浅析及设计模式

          本文链接:https://www.haomeiwen.com/subject/cyydcftx.html