Android 触摸事件处理流程
29 Jul 2014在Android中,所谓消费了一个touch事件均以返回值的真假来确定。true = 已消费;false = 未消费
Activity.dispatchTouchEvent
-
一个touch事件首先会交给Activity.dispatchTouchEvent()进行分发给Activity的根View。当没有任何一个子View消费掉这个事件的时候,这个事件会交给Activity.onTouchEvent()来处理。
-
当Activity.dispatchTouchEvent()返回true,意味屏蔽了所有的touch事件。
dispatchTouchEvent()的处理流程代码:
public boolean dispatchTouchEvent(MotionEvent ev) {
if(!onInterceptTouchEvent()){
for(View child : children){
if(child.dispatchTouchEvent(ev))
return true;
}
}
return super.dispatchTouchEvent(ev);
}
ViewGroup.onInterceptTouchEvent一个完整的touch事件是指从ACTION_DOWN到ACTION_UP/ACTION_CANCEL,之间可能包括许多ACTION_MOVE。其中ACTION_DOWN是一个开始事件也是最重要的一个事件,是否处理ACTION_DOWN会直接影响到其是否能接受到后续事件。
-
当ViewGroup的onInterceptTouchEvent()返回true时,其目标子view会接受到ACTION_CANCEL事件,其表明目标子View将不再接受后续的所有touch事件,而后续的touch事件都将交由ViewGroup的onTouchEvent()来处理。
-
当ViewGroup的onInterceptTouchEvent()返回false时,那么这个事件不会交给本ViewGroup的onTouchEvent()处理,而是往下传递。
-
ViewGroup提供了一个requestDisallowInterceptTouchEvent(boolen),它的作用是当某个子View不希望它的父ViewGroup和祖先ViewGroup通过onInterceptTouchEvent()截获touch事件时,给这个方法传递true 。
-
当没有子View消费掉touch event时,ViewGroup.onTouchEvent()将被调用。
View.onTouchEvent
-
如果View想处理一个Touch Event,那么它必须处理ACTION_DOWN事件,否则将接收不到任何后续事件。
-
当onTouchEvent返回true,意味着这个事件被消费掉了,false则会将该事件上传到ViewGroup的onTouchEvent()来处理。
ref: Google Android Doc ref: Youbube