android事件传递机制

Sample Flowchart Template.png
Touch事件相关方法 方法功能 所在对象
dispatchTouchEvent(MotionEvent ev) 事件分发 Activity、View、Viewgroup均有此方法
onInterceptTouchEvent(MotionEvent ev) 事件拦截 仅在Viewgroup中有此方法
onTouchEvent(MotionEvent ev) 事件消费 Activity、View、Viewgroup中均有此方法
  • dispatchTouchEvent():上层传递过来的事件,均首先到达此方法,由此方法进行分发处理。在其中会调用onInterceptTouchEvent()方法和onTouchEvent()方法;在Activity、View和Viewgroup中,该方法的实现不同。

    1. 在Activity中:dispathcTouchEvent()默认会将事件传递给其下层控件,若下层控件(包括该控件及其子控件)均不消费此事件,则会调用Activity的onTouchEvent()方法。
    2. 在View中:dispatchTouchEvent()会直接将事件传递给本控件的onTouchEvent()方法,onTouchEvent()返回false表示当前控件不消费该事件,事件交由父控件的onTouchEvent()处理。onTouchEvent()返回true表示消费该事件,事件停止传递。

    注意:onTouchEvent()返回false后,下一个事件将不会再传递至该控件

    3.在Viewgroup中:dispatchTouchEvent()先调用onIterceptTouchEvent()方法,判断是否需要拦截该事件。若onIntercepTouchEvent()方法返回true,表示需要拦截该事件,然后调用本控件的onTouchEvent()方法对事件进行处理;若onIntercepTouchEvnet()方法返回false,表示不拦截该事件,交由其下层对应的子控件去处理。

  • onInterceptTouchEvent():事件拦截,Viewgroup的特有方法,用以判断是否拦截当前事件。即是由本控件自行处理事件,还是继续向下传递,由其子控件处理该事件。默认返回false,不拦截。

  • onTouchEvent():事件消费。用以响应处理上层传递过来的事件。返回true表示消费该事件;返回false表示不消费该事件,交由父控件处理。

注意:
事件消费的顺序:控件的onTouch()监听--->onTouchEvent()方法--->控件的onClick()监听
即,若控件设置了setOnTouchListener(),则事件最先派发到监听器的onTouch()方法。若onTouch()方法返回true,则事件被消费,停止传递,onToucnEvent()方法将不会收到事件;若onTouch()方法返回false,则事件可继续传递至onTouchEvent()方法。
onClick()方法响应的两个必要条件:1.ACTION_DOWNACTION_UP动作发生后;2.控件super.onTouchEvent()得到调用。

总结:

  • dispatchTouchEvent()

    1. 一般使用系统默认的处理即可,无需改动。

    2.父控件可调用其任意子控件的dispatchTouchEvent()方法,让指定子控件响应事件。

  • onInterceptTouchEvent()
    一般用以处理父控件与子控件之间事件响应的冲突。若父控件想自行处理事件,而不希望子控件响应事件,则让onInterceptTouchEvent()方法返回true进行事件拦截即可。默认返回false,不拦截。

  • onTouchEvent()

    1. 用以响应事件,自己消费事件,返回true;希望父控件消费事件,返回false;
    2. 最好先调用super.onTouchEvent()方法。(只用当super.onTouchEvent()得到执行,onClick()方法才能响应事件)。
Touch事件传递.jpg

参考链接:
http://blog.csdn.net/yanzi1225627/article/details/22592831
http://blog.csdn.net/leewenjin/article/details/22928363

你可能感兴趣的:(android事件传递机制)