1.事件分发机制涉及到三个方法:
1).public boolean onInterceptTouchEvent(MotionEvent ev);
2).public boolean dispatchTouchEvent(MotionEvent ev);
3).public boolean onTouchEvent(MotionEvent event);
2.ViewGroup拥有上述三个方法,View中没有onInterceptTouchEvent()方法;
3.事件传递主要是在ViewGroup与View之间;
4.dispatchTouchEvent()方法(viewgroup):
1:如果是返回true或者false 都不会继续往下层分发,如果返回false 则调用上层的onTouchEvent()方法(如果是Activity的ViewGroup 则 事件被系统消费);如果返回true,则表明事件已经被消费(ps:如果你想让你的activity里面的空间都不具备消费事件的能力,直接再Activity的dispatchTouchEvent()方法返回true);
2:如果返回的是默认的super.dispatchTouchEvent()则继续往下层分发;
5.如果最终都没有view消费事件,则事件会在Activity中被消费;
6.view的onClickListener的优先级低于onTouchListener:
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
onClickListener是在onTouchEvent方法中的,所以验证了第6条;
7.一般情况下,ViewGroup或者View消费了事件(比如ACTION_DOWN),那么后续的事件(ACTION_MOVE或ACTION_UP)也将交由它处理;
8.子View如果消费了事件,那么ViewGroup将不会收到下层传来的事件;
如有错误,请指正。
最后附上一张图(copy过来的):