文章是随笔整理,主要是给自己看的,防止以后忘记了。
以单次的点击事件(比如Action_down、Action_move、Action_up)为例进行说明,首先传递给View的dispatchTouchEvent方法处理,如果该方法返回true,则进行下次的点击事件分发,如果该方法返回false,则停止事件的分发。
在dispatchTouchEvent方法中先调用onTouchListener(如果没有设置,默认返回false),后调用onTouchEvent方法(其中调用onClick)。所以如果在onTouchListener中返回false,则表现为onClickListener不会被回调。
boolean result = false;
.......
if (onFilterTouchEventForSecurity(event)) {
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
}
......
return result;
看上边的代码片段可得出,如果没有设置过onTouchListener,第一个if自然执行不了,onTouchEvent自然会执行,意味着onClick也会执行。如果设置了onTouchListener并且返回true,那么result为true,下一个if判断条件中的&&后的内容得不到执行,表现出来的就是onClick没有被执行。
onTouchListener不管返回true或者false,只能影响onTouchEvent(即onClick)的执行,并不能阻断点击事件的传递。
但是onTouchEvent如果返回false,那么就会阻断touch事件继续向下传递。
http://blog.youkuaiyun.com/lvxiangan/article/details/9309927