在Android开发中的某些场景下,可能会对view的touch和click都设置进行监听事件,但是它们的执行顺序是什么样的呢?返回值又会有什么影响?
在事件分发的过程中,如果事件能够分发给当前view,那么一定会执行dispatchTouchEvent方法。
public boolean dispatchTouchEvent(MotionEvent event) {
...
boolean result = false;
...
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
...
}
在第一个if语句中,有一个重要的判断语句, li.mOnTouchListener.onTouch(this, event),这条分两步理解:
第一:回调OnTouchListener的onTouch方法。
第二:获得返回值,如果返回值为true,则result = true,否则为false。
在第二个if语句中,如果result为false,则会执行view的onTouchEvent方法。看一下onTouchEvent方法。
public boolean onTouchEvent(MotionEvent event) {
...
performClick();
...
}
在onTouchEvent的方法中,有一个performClick方法,顾名思义则是执行view的 click事件,进去看一下performClick方法。
public boolean performClick() {
...
li.mOnClickListener.onClick(this);
...
}
由此可见,click方法是在performClick中所执行。
有个问题:为什么performClick在UP事件中执行,而不是DOWN事件呢?
因为Google设计师在设计点击事件的时候,只有在手指离开屏幕的时候才算是一次完成的click事件。
由此我们可以获得以下结论:
第一:OnTouchListener的回调优先于OnClickListener的回调。
第二:OnTouchListener中onTouch方法如果返回true,则不会执行view的onTouchEvent方法,也就更不会执行view的onClickListener的onClick方法,此时onClickListener失效,返回false,则两个都会执行。
本人愚见,欢迎各路大佬抛砖过来!!!