<br />
下面是事件分发机制的一些结论
-
ViewGroup默认不拦截任何事件。Android源码中ViewGroup的onInterceptTouchEvent方法默认返回false。
<br /> -
View没有onInterceptTouchEvent方法,一旦有点击事件传递给它,那么它的onTouchEvent方法就会被调用。
<br /> -
正常情况下,一个事件序列只能被一个View拦截且消耗。因为一旦一个元素拦截了某次事件,那么同一个事件序列内的所有事件都会直接交给它处理,因此同一个事件序列中的事件不能分别由两个View同时处理,但通过特殊手段可以做到,比如一个View将本该自己处理的事件通过onTouchEvent强行传递给其他View处理。
<br /> -
某个View一旦决定拦截,那个这一个事件序列都只能由它来处理,并且它的onInterceptTouchEvent方法不会再被调用。就是说当一个View开始拦截一个事件后,系统会把同一个事件序列内的其他方法都直接交给它来处理,因此就不用再调用它的onInterceptTouchEvent询问是否要拦截事件了。
<br /> - 某个View一旦开始处理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent返回false),那么同一事件序列中的其他事件都不会再交给它来处理,并且事件将重新交给它的父元素去处理,就是父元素的onTouchEvent被调用。意思就是事件一旦交给一个View处理,那么它就必须消耗掉,否则同一事件序列中剩下的事件就不再交给它来处理了。
<br /> - 如果一个View是不可点击的,那它的onTouchEvent默认是不消耗事件的,返回值是false。这时它的clickable和longClickable属性都是false。比如一个TextView。
<br /> - View的enable属性不影响onTouchEvent的默认返回值。哪怕一个View是disable状态的,只要它的clickable或者longClickable有一个是true,那么它的onTouchEvent就返回true。
<br /> - onClick会触发的前提是当前View是可点击的,并且接收到了down和up事件。
<br />