
Touch事件相关方法 | 方法功能 | 所在对象 |
---|---|---|
dispatchTouchEvent(MotionEvent ev) | 事件分发 | Activity、View、Viewgroup均有此方法 |
onInterceptTouchEvent(MotionEvent ev) | 事件拦截 | 仅在Viewgroup中有此方法 |
onTouchEvent(MotionEvent ev) | 事件消费 | Activity、View、Viewgroup中均有此方法 |
-
dispatchTouchEvent():上层传递过来的事件,均首先到达此方法,由此方法进行分发处理。在其中会调用
onInterceptTouchEvent()
方法和onTouchEvent()
方法;在Activity、View和Viewgroup中,该方法的实现不同。- 在Activity中:
dispathcTouchEvent()
默认会将事件传递给其下层控件,若下层控件(包括该控件及其子控件)均不消费此事件,则会调用Activity的onTouchEvent()
方法。 - 在View中:
dispatchTouchEvent()
会直接将事件传递给本控件的onTouchEvent()
方法,onTouchEvent()
返回false表示当前控件不消费该事件,事件交由父控件的onTouchEvent()
处理。onTouchEvent()
返回true表示消费该事件,事件停止传递。
注意:
onTouchEvent()
返回false后,下一个事件将不会再传递至该控件3.在Viewgroup中:
dispatchTouchEvent()
先调用onIterceptTouchEvent()
方法,判断是否需要拦截该事件。若onIntercepTouchEvent()
方法返回true,表示需要拦截该事件,然后调用本控件的onTouchEvent()
方法对事件进行处理;若onIntercepTouchEvnet()
方法返回false,表示不拦截该事件,交由其下层对应的子控件去处理。 - 在Activity中:
-
onInterceptTouchEvent():事件拦截,Viewgroup的特有方法,用以判断是否拦截当前事件。即是由本控件自行处理事件,还是继续向下传递,由其子控件处理该事件。默认返回false,不拦截。
-
onTouchEvent():事件消费。用以响应处理上层传递过来的事件。返回true表示消费该事件;返回false表示不消费该事件,交由父控件处理。
注意:
事件消费的顺序:控件的onTouch()
监听--->onTouchEvent()
方法--->控件的onClick()
监听
即,若控件设置了setOnTouchListener()
,则事件最先派发到监听器的onTouch()
方法。若onTouch()
方法返回true,则事件被消费,停止传递,onToucnEvent()
方法将不会收到事件;若onTouch()
方法返回false,则事件可继续传递至onTouchEvent()
方法。
onClick()方法响应的两个必要条件:1.ACTION_DOWN
和ACTION_UP
动作发生后;2.控件super.onTouchEvent()
得到调用。
总结:
-
dispatchTouchEvent()
- 一般使用系统默认的处理即可,无需改动。
2.父控件可调用其任意子控件的
dispatchTouchEvent()
方法,让指定子控件响应事件。 -
onInterceptTouchEvent()
一般用以处理父控件与子控件之间事件响应的冲突。若父控件想自行处理事件,而不希望子控件响应事件,则让onInterceptTouchEvent()
方法返回true进行事件拦截即可。默认返回false,不拦截。 -
onTouchEvent()
- 用以响应事件,自己消费事件,返回true;希望父控件消费事件,返回false;
- 最好先调用
super.onTouchEvent()
方法。(只用当super.onTouchEvent()
得到执行,onClick()
方法才能响应事件)。

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