美文网首页Android开发
OnTouch和OnClick事件源码分析

OnTouch和OnClick事件源码分析

作者: 一凡和梓墨 | 来源:发表于2016-08-03 16:58 被阅读396次

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

    20131223150314890.png

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

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


    QQ图片20160803165430.png

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


    QQ图片20160803165449.png

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

    20131223145413187.png

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


    20131223145423203.png

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

    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事件源码分析

        本文链接:https://www.haomeiwen.com/subject/pggqsttx.html