OnTouch和OnClick事件源码分析

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

OnTouch和OnClick事件源码分析_第1张图片
20131223150314890.png

在View中的dispatchTouchEvent方法中可以看到,是先执行OnTouchListener监听器中的onTouch方法,如果onTouchListener不为null,并且onTouch方法返回false的时候才执行onTouchEvent方法,如果我们把onTouch方法的返回值变成了true,onTouchEvent方法就不会执行。这里一定要注意onTouchEvent方法和onTouch方法的区别。

写了一个小Demo,具体代码就不上传了,基本是一个LinearLayout 里面放了一个TextView:


OnTouch和OnClick事件源码分析_第2张图片
QQ图片20160803165430.png

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


OnTouch和OnClick事件源码分析_第3张图片
QQ图片20160803165449.png

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

OnTouch和OnClick事件源码分析_第4张图片
20131223145413187.png

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


OnTouch和OnClick事件源码分析_第5张图片
20131223145423203.png

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

OnTouch和OnClick事件源码分析_第6张图片
20131223145433843.png

从一张图片浏览下来就是整个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。

你可能感兴趣的:(OnTouch和OnClick事件源码分析)