布局控件ViewGroup中包含子View,而子View就是最终展示给用户并与用户交互的控件如输入框EditView及文字展示TextView,这篇文章暂且称该类控件为“最终控件”。
消费事件函数onTouchEvent()
拦截事件函数onInterceptTouchEvent()
最终控件中只存在消费事件函数onTouchEvent(),不存在拦截事件onInterceptTouchEvent()函数,在onTouchEvent()函数中消费底层View传来的Down事件,处理完后
return false,意思就是告诉系统,我只需要Down事件就ok了Move及Up不再需要了,也就终止了本身的Touch事件,但是这些事件需要善始善终啊,怎么办,就返回到上一级布局控件ViewGroup中消费掉,以此类推直到布局控件onTouchEvent()函数中Down返回true为止,后续的Move及Up事件也会在该布局控件中消费掉。
return true,意思就是继续消费后续的Move及Up事件。
布局控件ViewGroup中存在onInterceptTouchEvent(),目的是拦截事件自己处理
在onInterceptTouchEvent()函数中接收到Down事件处理完
A情况:return true,拦截Touch事件不再传递直接回调该布局控件的onTouchEvent(),后续的Move及Up事件传递不再经过该布局控件的onInterceptTouchEvent()函数,直接回调该布局控件的onTouchEvent()。
B情况:return false,不拦截Down事件,继续向子View传递,直到最终控件并调用最终控件的onTouchEvent()
在onInterceptTouchEvent()函数中接收到Move事件(前提是B情况)处理完
AM情况:return true,取消Move事件,如果子View不是最终控件则调用onInterceptTouchEvent()函数传入的Action为ACTION_CANCEL,依次类推直到最终控件时调用最终控件的onTouchEvent()传入的Action为ACTION_CANCEL,再回到该布局控件中,此时不会再回调onInterceptTouchEvent()函数,直接回调该布局控件的onTouchEvent()此时传入Action为ACTION_UP,Move事件传递结束。
BM情况:return false,不拦截Down事件,继续向子View传递,直到最终控件并调用最终控件的onTouchEvent()函数
在onInterceptTouchEvent()函数中接收到Up事件(前提是BM情况)处理完
AU情况:return true,取消Up事件,如果子View不是最终控件则调用onInterceptTouchEvent()函数传入的Action为ACTION_CANCEL,依次类推直到最终控件时调用最终控件的onTouchEvent()传入的Action为ACTION_CANCEL,UP事件传递结束。
BU情况:return false,不拦截Up事件,继续向子View传递,直到最终控件并调用最终控件的onTouchEvent()函数