事件的触发成功其实有三个坎,只有这三个坎都过了才能让我们见到他的触发效果。那么到底是哪三个方法阻
碍了事件的分发呢??下面我先一个一个的介绍,当然这里触发的顺序也是按数序。
一.onInterceptTouchEvent事件
这个方法主要是viewgroup的事件拦截,也就是说是view父类的方法。如果你是最基础的view那么你就
不会有这个方法,其实想想也对你没有子view拦截什么呀。这个方法如果设置true的话那么touch事件就不会传入
子view中去,意思就是说如果你在父view这里设置true的话,那个触摸事件只能在父view触发。举个例子就是如
果你有一个相对布局,里面有一个button。这里你对相对布局里面设置了onInterceptTouchEvent事件是true
的话,那么你对button的点击事件就失效了。这里的touch事件其实已经被相对布局所拦截。一般情况下默认设置
false。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
二.dispatchTouchEvent事件
这个方法是事件的分发,也就是你需要触发onTouchEvent事件不但需要父view的onInterceptTouchEvent
同意,还需要本身的dispatchTouchEvent的事件同意分发这个事件,onTouchEvent事件才有资格处理这个事
件。不然的话那么这个事件只能又返回到父view去消费了!!
<span style="font-family:SimSun;"> @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}</span>
三.onTouchEvent事件
首先系统view的onTouchEvent事件中包含了一系列的action,例如
ACTION_CANCEL ACTION_DOW ACTION_UP ACTION_MOVE ACTION_OUTSIDE
这些动作组成。一次事件只有在第一个action返回true之后才会接下来发生另一个动作。
onTouchEvent这个方法最后会返回一个true or false 表示这个事件是否消费。当它返回true的时候表示这个事件消费了,false表示没有消费就
会返回到父类去消费。当然 onTouchEvent事件中的action过程中只要首先有一个返回true or false 那么这个事件对应的就全都是true or
false,因为一次onTouchEvent事件只能有一个返回值。当然你的下一次onTouchEvent事件又可以重新定义了。(一次action就会调用一次
onTouchEvent事件,onTouchEvent事件包含了一系列的action)
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
四.事件的分发的相关性
这里我来系统的说明一下他们之间的关系:
一.事件先传到父view 的onInterceptTouchEvent方法中判断是否拦截事件传递到子view(一般系统默
认不拦截),如果拦截的话那么父view自己消费继续下面的二与三方法。事件拦截是从父view开始。
二.当一中表明不拦截,那么事件传递到底层子view的dispatchTouchEvent方法中判断是否分配(一般系
统默认分配),如果不允许分配的话,那么事件就会返回到父view去执行二与三方法。
三.当二中显示允许传递那么接下来就是onTouchEvent事件判断是否消费(这里一般系统默认消费),如果
onTouchEvent事件显示不消费的那么事件就会返回到父view中去执行二.三方法判断是否消费这个事件(这里
说明下onTouchEvent消费事件都是从最底层view开始处理)。
四。下面是view之间的响应方法的关系图