http://blog.csdn.net/chunqiuwei/article/details/41084921
http://www.jianshu.com/p/35a8309b9597
dispatchTouchEvent:这个方法用来分发TouchEvent。
onInterceptTouchEvent:这个方法用来拦截TouchEvent。
onTouchEvent:这个方法用来处理TouchEvent。
http://www.binkery.com/archives/470.html
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
1.
在 dispatchTouchEvent() 方法里,如果 mOnTouchListener 不为空,就调用 mTouchListener.onTouch() 方法,如果返回 true ,那么 dispatchTouchEvent 也就返回 true . 如果 listener 返回 false ,那么就调用 onTouchEvent() 方法。咱们再去看看 onTouchEvent() 方法。
2.
public boolean dispatchTouchEvent(MotionEvent ev)
final boolean intercepted;
intercepted = onInterceptTouchEvent(ev);
if(!intercepted){
for(children){
dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)
}
}
3.
private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel, View child, int desiredPointerIdBits)
if (child == null) {
handled = super.dispatchTouchEvent(event);
} else {
handled = child.dispatchTouchEvent(event);
}
4.
Android事件传递流程:
事件都是从Activity.dispatchTouchEvent()开始传递
事件由父View传递给子View,ViewGroup可以通过onInterceptTouchEvent()方法对事件拦截,停止其向子view传递
如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。
如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来,也就是说ACTION_DOWN必须返回true,之后的事件才会传递进来
OnTouchListener优先于onTouchEvent()对事件进行消费
http://www.2cto.com/kf/201412/365603.html
/**
* 如果上面的if不满足,当然也不会执行break语句.
* 于是代码会执行到这里来.
*
* 调用方法dispatchTransformedTouchEvent()将Touch事件传递给子View做
* 递归处理(也就是遍历该子View的View树)
* 该方法很重要,看一下源码中关于该方法的描述:
* Transforms a motion event into the coordinate space of a particular child view,
* filters out irrelevant pointer ids, and overrides its action if necessary.
* If child is null, assumes the MotionEvent will be sent to this ViewGroup instead.
* 将Touch事件传递给特定的子View.
* 该方法十分重要!!!!在该方法中为一个递归调用,会递归调用dispatchTouchEvent()方法!!!!!!!!!!!!!!
* 在dispatchTouchEvent()中:
* 如果子View为ViewGroup并且Touch没有被拦截那么递归调用dispatchTouchEvent()
* 如果子View为View那么就会调用其onTouchEvent(),这个就不再赘述了.
*
*
* 该方法返回true则表示子View消费掉该事件,同时进入该if判断.
* 满足if语句后重要的操作有:
* 1 给newTouchTarget赋值
* 2 给alreadyDispatchedToNewTouchTarget赋值为true.
* 看这个比较长的英语名字也可知其含义:已经将Touch派发给新的TouchTarget
* 3 执行break.
* 因为该for循环遍历子View判断哪个子View接受Touch事件,既然已经找到了
* 那么就跳出该for循环.
* 4 注意:
* 如果dispatchTransformedTouchEvent()返回false即子View
* 的onTouchEvent返回false(即Touch事件未被消费)那么就不满足该if条件,也就无法执行addTouchTarget()
* 从而导致mFirstTouchTarget为null.那么该子View就无法继续处理ACTION_MOVE事件
* 和ACTION_UP事件!!!!!!!!!!!!!!!!!!!!!!
* 5 注意:
* 如果dispatchTransformedTouchEvent()返回true即子View
* 的onTouchEvent返回true(即Touch事件被消费)那么就满足该if条件.
* 从而mFirstTouchTarget不为null!!!!!!!!!!!!!!!!!!!
* 6 小结:
* 对于此处ACTION_DOWN的处理具体体现在dispatchTransformedTouchEvent()
* 该方法返回boolean,如下:
* true---->事件被消费----->mFirstTouchTarget!=null
* false--->事件未被消费---->mFirstTouchTarget==null
* 因为在dispatchTransformedTouchEvent()会调用递归调用dispatchTouchEvent()和onTouchEvent()
* 所以dispatchTransformedTouchEvent()的返回值实际上是由onTouchEvent()决定的.
* 简单地说onTouchEvent()是否消费了Touch事件(true or false)的返回值决定了dispatchTransformedTouchEvent()
* 的返回值!!!!!!!!!!!!!从而决定了mFirstTouchTarget是否为null!!!!!!!!!!!!!!!!从而进一步决定了ViewGroup是否
* 处理Touch事件.这一点在下面的代码中很有体现.
*
网友评论