第一句话总是最重要的:
Android的拦截机制是一个自顶向下的事件分发与自底向上的事件响应机制
自顶向下的分发,就是我从View树的顶部开始向下分发事件
自底向上的响应,就是当事件传递到View树的底层都不被拦截,那么他就开始往上层层响应
View
View有2个方法 dispatchTouchEvent和onTouchEvent,源码如下:
3363 public boolean dispatchTouchEvent(MotionEvent event) {
3364 if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
3365 mOnTouchListener.onTouch(this, event)) {
3366 return true;
3367 }
3368 return onTouchEvent(event);
3369 }
根据我上边的话,可以这么理解
dispatchTouchEvent 是用来 事件分发的
onTouchEvent 是用来事件响应的
在没有设置OnTouchListener的情况下,当事件分发到该View上,dispatchTouchEvent和onTouchEvent就会被调用。如果onTouchEvent返回false,则事件继续向下传递。
View的onTouchEvent源码
3792 public boolean onTouchEvent(MotionEvent event) {
3793 final int viewFlags = mViewFlags;
3794
3795 if ((viewFlags & ENABLED_MASK) == DISABLED) {
3796 // A disabled view that is clickable still consumes the touch
3797 // events, it just doesn't respond to them.
3798 return (((viewFlags & CLICKABLE) == CLICKABLE ||
3799 (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
3800 }
3801
3802 if (mTouchDelegate != null) {
3803 if (mTouchDelegate.onTouchEvent(event)) {
3804 return true;
3805 }
3806 }
3807
3808 if (((viewFlags & CLICKABLE) == CLICKABLE ||
3809 (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
3810 switch (event.getAction()) {
3811 case MotionEvent.ACTION_UP:
3812 if ((mPrivateFlags & PRESSED) != 0) {
3813 // take focus if we don't have it already and we should in
3814 // touch mode.
3815 boolean focusTaken = false;
3816 if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
3817 focusTaken = requestFocus();
3818 }
3819
3820 if (!mHasPerformedLongPress) {
3821 // This is a tap, so remove the longpress check
3822 if (mPendingCheckForLongPress != null) {
3823 removeCallbacks(mPendingCheckForLongPress);
3824 }
3825
3826 // Only perform take click actions if we were in the pressed state
3827 if<