android 事件处理源码
DOWN
public boolean dispatchTouchEvent(MotionEvent event) {
先判断是否有setOnTouchListener,如果有并且onTouch返回了true,那么就不会再执行onClick和onLongClick事件
onTouch
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
onTouch方法未处理事件
在onTouchEvent中查看是否设置了onClick事件,如果有就表示要处理事件,返回true
onTouchEvent(event)
//设置了OnClickListener或者OnLongClickListener后所有事件该View处理
final boolean clickable = ((viewFlags & CLICKABLE) == CLICKABLE
|| (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)
|| (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE;
setOnClickListener
setClickable(true);
setFlags(clickable ? CLICKABLE : 0, CLICKABLE);
setOnLongClickListener
setLongClickable(true);
setFlags(longClickable ? LONG_CLICKABLE : 0, LONG_CLICKABLE);