从源码的角度理解onTouch和onClick的执行顺序

    在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,则两个都会执行。

本人愚见,欢迎各路大佬抛砖过来!!!

你可能感兴趣的:(从源码的角度理解onTouch和onClick的执行顺序)