Activity,ViewGroup,View
1.默认情况
Activity->dispatchTouchEvent
MyLinearLayout->dispatchTouchEvent
MyLinearLayout->onInterceptTouchEvent
customview->dispatchTouchEvent
customview->onTouchEvent
MyLinearLayout->onTouchEvent
Activity->onTouchEvent
Activity->dispatchTouchEvent
Activity->onTouchEvent
为什么dispatchTouchEvent会调用两次?
因为有ACTION_DOWN(按下)和ACTION_UP(抬起)两个操作。
2.ViewGroup调用onInterceptTouchEvent拦截,返回true
Activity->dispatchTouchEvent
MyLinearLayout->dispatchTouchEvent
MyLinearLayout->onInterceptTouchEvent
MyLinearLayout->onTouchEvent
Activity->onTouchEvent
Activity->dispatchTouchEvent
Activity->onTouchEvent
3.ViewGroup调用onInterceptTouchEvent拦截,返回true,并消费onTouchEvent,返回true
Activity->dispatchTouchEvent
MyLinearLayout->dispatchTouchEvent
MyLinearLayout->onInterceptTouchEvent
MyLinearLayout->onTouchEvent
Activity->dispatchTouchEvent
MyLinearLayout->dispatchTouchEvent
MyLinearLayout->onTouchEvent
4.在View消费onTouchEvent,返回true
Activity->dispatchTouchEvent
MyLinearLayout->dispatchTouchEvent
MyLinearLayout->onInterceptTouchEvent
customview->dispatchTouchEvent
customview->onTouchEvent
Activity->dispatchTouchEvent
MyLinearLayout->dispatchTouchEvent
MyLinearLayout->onInterceptTouchEvent
customview->dispatchTouchEvent
总结:
a.屏幕按下,先调用activity的dispatchEvent,然后调用viewgroup的dispatchEvent,最后调用view的dispatchEvent
b.dispatchEvent在内部会调用onTouchEvent
c.先调用onTouch,再调用onClick。onTouch默认返回false,如果返回true的话,onTouchEvent不会调用
d.在activity中dispatchTouchEvent如果不调用父类的方法,例如返回false或者true,会拦截所有事件。
f.onTouchEvent中父类会调用onClick
g.onLongClick的返回值,返回fasle,会继续传递最后调用onClick,返回true,最后不会调用onClick