首先全部的View和Activity都有spa
dispatchTouchEvent//用来分发Touch onTouchEvent//用来响应Touch
而ViewGroup则还有一个code
onInterceptTouchEvent//用来拦截Touch
当按下界面时首先是由Activity的 dispatchTouchEvent被调用。而后是根View的dispatchTouchEvent,不断向子View传递,而后由最最后的子View首先响应onTouchEvent,接着父View的onTouchEvent不断被调用。事件
可是若是当前的View是ViewGroup时,则在dispatchTouchEvent被调用后onInterceptTouchEvent会被调用。it
以上的状况都未返回默认的super.xxxTouchEvent的状况。List
Activity:若是Activity的dispatchTouchEvent没调用super.dispatchTouchEvent那么Touch事件在此就终结了,后面将不会有任何和Touch有关的方法被调用。方法
因此说若是重写Activity的dispatchTouchEvent那么必定要调用super.dispatchTouchEvent,除非你不打算让Touch事件向下传递。Activity的dispatchTouchEvent方法的返回值并不会影响Touch事件后续调用。因此返回true,false好像无所谓。总结
ViewGroup:若是ViewGroup的dispatchTouchEvent没调用super.dispatchTouchEvent而且返回true那么Touch事件在此就终结了,后面将不会有任何和Touch有关的方法被调用。若是返回false那么父View的onTouchEvent将被调用。 若是调用super.dispatchTouchEvent而且返回值为true那么父View的onTouchEvent将不会被调用。View同理。di
onInterceptTouchEvent若是返回值为true则表示Touch事件被拦截,子View的dispatchTouchEvent将不会被调用。该方法默认返回false,表示子View的dispatchTouchEvent将会被调用。vi
onTouchEvent该方法表示触发了Touch事件。若是返回true则表示该事件当前View已经处理完了,父View不用管了。co
若是重写了onTouchEvent但又没有调用super.onTouchEvent那么将会影响当前View的OnClickListener等事件的触发。
总结
dispatchTouchEvent/onTouchEvent任意一个返回true那么事件在此终结。父View的onTouchEvent将不会被调用。
super.dispatchTouchEvent用来调用子View的dispatchTouchEvent和本身的onTouchEvent
super.onTouchEvent用来调用本身的OnClickListener等事件。
onInterceptTouchEvent的返回值用来表示是否拦截传递给子View的事件。true表示子View的dispatchTouchEvent不被调用。
若是当前的View或ViewGroup有OnClickListener等方法那么Touch将在此终结无论dispatchTouchEvent/onTouchEvent的返回值未何。