事件传递一共涉及3个方法:
1.dispatchTouchEvent
2.onInterceptTouchEvent
3.onTouchEvent
首先,ViewGroup中有这三个方法,而像TextView或者Button这样的控件,不可以再有子控件的View,是没有onInterceptTouchEvent方法的。
事件的传递像是一个循环的过程,由父控件的dispatchTouchEvent,一直向下传导(向子控件传导),传导到最后的没有子控件的View时,就要看子控件是否会消费掉这个事件了,如果消费(onTouchEvent方法)了,就没有父控件什么事了,反之如果没有消费,这个事件就会从子控件向上传导(向父控件传导),直到父控件有人消费(调用onTouchEvent方法),如果一直没有父控件消费,最后会由activity消费。
依据上图就像一个由上往下,又由下往上的循环。
值得注意的一点是:上面三个方法的关系由一下伪代码给出:
boolean dispatchTouchEvent(MotionEvent ev){
boolean consume = false;
if(onInterceptTouchEvent()){
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
consume = true;
}