看了《Android开发艺术探索》加上自己的一些实践,对View的事件分发做个总结记录:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean isConsumed = false;
if(onInterceptTouchEvent(ev)){
isConsumed = onTouchEvent(ev);
}else{
isConsumed = child.dispatchTouchEvent(ev);
}
return isConsumed;
}
1、ViewGroup有dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,View则没有onInterceptTouchEvent这个方法;
2、如果ViewGroup的onInterceptTouchEvent返回true,则事件不会传递给子View,事件会传递给当前ViewGroup的onTouchEvent方法去处理;如果ViewGroup的onInterceptTouchEvent返回false,那么事件则会继续往下传递给子View,这时候不会回调ViewGroup的onTouchEvent方法。
3、如果View设置了OnTouchListener,则如果Listener的onTouch返回了true,则View的onTouchEvent方法不会被回调,如果onTouch返回false,则View的onTouchEvent方法会被回调;
4、如果View的onTouchEvent方法返回false,那么这个View的父容器的onTouchEvent会被调用。
网友评论