阅读郭林的文章后,记录一下自己学到的知识
当触摸一个View的时候,会调用dispatchTouchEvent方法,该方法中最重要的代码如下
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
通过例子来说明该方法的执行流程:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("Button", "onTouch execute, action " + event.getAction());
return false;
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e("Button", "onClick execute");
}
});
分别给Button设置OnTouchListener和OnClickListener事件,当点击Button时,输出日志如下:
Button: onTouch execute, action 0
Button: onTouch execute, action 1
Button: onClick execute
由此可见,它首先执行onTouch方法,再执行onClick方法。分析dispatchTouchEvent方法,确实如此。但是注意,当将onTouch方法中返回true时,就不再执行onClick方法,表明该事件已经被消费掉,不再往下传递。