一 简单的事件响应
自定义View,设置onTouchListener方法,当其返还true的时候,自定义View定义的onClickListener不响应,为什么?
解析:
- View的父容器调用其dispatchTouchEvent方法;
- 在dispatchTouchEvent方法中定义了一个result变量,当onTouchListener返回true时,result为true。
- 当result为true时,onTouchEvent方法不会被执行。
- onTouchEvent方法中,当MotionEvent.ACTION_UP时,会调用performClick方法。
- 由于onTouchEvent不执行,所以performClick不执行,从而导致performClick调用的onClickListener不会执行
View 的 dispatchTouchEvent方法:
public boolean dispatchTouchEvent(MotionEvent event) {
...
// li.mOnTouchListener != null -> result = true;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
// result = true 在前 -> 双&运算,onTouchEvent不会执行
if (!result && onTouchEvent(event)) {
result = true;
}