事件分发需要执行的三个方法和次序:
dispatchTouchEvent() --->onInterceptTouchEvent() ---->onTouchEvent()

在View中的dispatchTouchEvent方法中可以看到,是先执行OnTouchListener监听器中的onTouch方法,如果onTouchListener不为null,并且onTouch方法返回false的时候才执行onTouchEvent方法,如果我们把onTouch方法的返回值变成了true,onTouchEvent方法就不会执行。这里一定要注意onTouchEvent方法和onTouch方法的区别。
写了一个小Demo,具体代码就不上传了,基本是一个LinearLayout 里面放了一个TextView:

点击TextView的时候,运行结果如下:

可以看到先执行的是MyTextView的dispatchTouchEvent方法(这个方法是每次触发onTouch方法都会执行的),然后是执行了onTouch方法中的ACTION_UP中的代码,然后执行了MyTextView中的onTouchEvent方法,当用户弹起手指的时候又一次执行了这样的一个过程,最后就是执行了onClick方法,在这里就来看一下onTouchEvent中的源代码:

因为TextView继承View,可以查看View中的onTouchEvent方法,在这个方法中又调用了ViewGroup中的onTouchEvent方法,下面在来看一下ViewGroup中的onTouchEvent方法:

在ACTION_UP中的这段代码就是执行了onClick方法,具体可以看一下performClick方法解释:

从一张图片浏览下来就是整个OnClick的执行过程!
OnClick的执行流程为:dispatchTouchEvent-->onTouch(返回为false)-->ViewGroup的onTouchEvent-->View的onTouchEvent-->在ACTION_UP的ACTION_UP时候performClick-->OnClick
OnClick不会执行的情况:
1.所以当onTouch()方法返回为true;onTouchEvent方法就不执行了,OnClick方法就不执行了。
2.当重写了onTouchEvent方法;并且没有super的时候,整个onTouchEvent方法里的内容不执行,就不会执行performClick。
网友评论