onTouchEvent事件传递机制总结

转载 2015年07月10日 11:57:29
Android的触摸事件消息传递机制,网上的各种分析、总结很多,有深入源码的,有图文并茂的。你总结他总结,终归也都是别人的总结,不是我总结。每次匆匆看过,知道个大概,也没仔细琢磨过,总是过一阵就记不清细节了,但这回项目中遇到了相关问题,看来是要下功夫认认真真深入研究了。

       先奉献上几个不错的资料,真是随手一百度,金银财宝挡不住:
                      http://blog.csdn.net/guitk/article/details/7057155      流程图不错;
                      http://blog.csdn.net/stonecao/article/details/6759189     源码分析,可深入了解内部机制与函数调用过程;
                      http://www.cnblogs.com/xiaoQLu/archive/2013/04/02/2994030.html   这个也不错;

       下面是用自己的话和画来总结的:
       总共涉及到的知识包括:
  • dispatchTouchEvent
  • onInterceptTouchEven
  • onTouchEvent
       这三个函数与ViewGroup、View之间的消息传递(虽然ViewGroup继承于View,但这里为了方便,ViewGroup是布局容器,View是布局内的控件)。
      以及ACTION_DOWN、ACTION_UP、ACTION_MOVE、ACTION_CANCEL这四种消息类型。


      触摸事件是一连串ACTION_DOWN,ACTION_MOVE..MOVE…MOVE、最后ACTION_UP。

      从头说起,先看ACTION_DOWN的处理。

      触摸事件总是先由最下面的ViewGroup先收到,在dispatchTouchEvent 函数中向其子控件派发ACTION_DOWN消息,子控件可能是ViewGroup也可能是View。

       在派发给子控件之前要先调用ViewGroup的onInterceptTouchEvent拦截器,如果消息没有被拦截,则向其子控件派发ACTION_DOWN消息(至于向哪个子控件派发消息,在dispatchTouchEvent 源码中有命中测试)。如果子控件是ViewGroup,则由它的dispatchTouchEvent 函数再次进行消息派发,重复上面的工作(检查拦截器,命中测试,向命中的子控件派发消息);如果子控件是View,则会由View的onTouchEvent响应ACTION_DOWN事件。

       如果在ViewGroup的onInterceptTouchEvent拦截器中将消息拦截了,则后续不会再向子控件传递ACTION_DOWN消息了,会直接将消息传递给这个ViewGroup的onTouchEvent进行响应。

       在控件进行onTouchEvent处理过程中,如果控件没有消费这个ACTION_DOWN事件(即返回false,消费这个词翻译过来真别扭,还是consume感觉顺一点…),则会将ACTION_DOWN传递给其父ViewGroup的onTouchEvent进行处理,直到由哪一层ViewGroup消费了ACTION_DOWN事件为止。

        如果有哪一个控件的onTouchEvent消费了ACTION_DOWN事件,则后续的n个ACTION_MOVE与1个ACTION_UP都会逐层传递到这个控件的onTouchEvent进行处理。

        这里要注意是逐层,也就是说每层的拦截器还是可以拦截到后续的ACTION_MOVE与ACTION_UP。如果后续的ACTION_MOVE与ACTION_UP被某层的拦截器拦截,则后续的事件将不会再传递给之前处理onTouchEvent的子控件,而是逐层传递给由拦截消息的这个控件的onTouchEvent函数进行处理,并且会向其之前接收事件的子控件发送一个ACTION_CANCEL,表示后续事件被取消了。

        如果所有控件的onTouchEvent都没有消费ACTION_DOWN事件,每层dispatchTouchEvent 都会返回false,表示事件没有被派发出去,后续的ACTION_MOVE与ACTION_UP也都不会再被传递了。

        这个就是整个触摸事件消息传递的流程。

       还有一种极端的情况,如果某个控件一开始消费了ACTION_DOWN,可是ACTION_MOVE接连来找它消费的时候,它并不消费ACTION_MOVE,但是后续的ACTION_MOVE与UP还是会来找它(真是嫁鸡随鸡嫁狗随狗…),只是每层的dispatchTouchEvent 会返回false,说明事件没被消费。此时如果想让上层ViewGroup接管事件,则必须由该ViewGroup在onInterceptTouchEvent中进行拦截。


转载自:http://www.eoeandroid.com/thread-319301-1-1.html

android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结

android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结 老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕...
  • u011140027
  • u011140027
  • 2013年09月12日 21:13
  • 1331

Android事件传递机制之onInterceptTouchEvent()和onTouchEvent()总结

老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕,在网上找到很多资料,才知道是怎么回事,这里总结一下,记住这个原则就会很清楚了: 1、onInterceptTouchEvent...
  • adayabetter
  • adayabetter
  • 2015年04月07日 15:24
  • 380

触屏事件传递机制disPatchTouchEvent onInterceptTouchEvent onTouchEvent

disPatchTouchEvent():方法负责派发触屏事件. onInterceptTouchEvent():方法负责是否截断触屏事件.只有ViewGroup(布局组件有) onTouchEven...
  • sinat_35073873
  • sinat_35073873
  • 2016年12月01日 12:15
  • 143

Android事件传递机制(dispatchTouchEvent -- onInterceptTouchEvent -- onTouchEvent)

http://gundumw100.iteye.com/blog/1052270 http://blog.csdn.net/android_tutor/article/details/7...
  • stayfish
  • stayfish
  • 2014年05月23日 13:08
  • 716

Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦。虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子Image...
  • zhangweiocp
  • zhangweiocp
  • 2016年07月19日 18:12
  • 308

Android的事件传递机制:dispatchTochEvent()、OnInterceptTochEvent()、OnTouchEvent()

温故而知新可以为师矣。学习过了自己记录一下。 这是假设所有的事件都是返回false,没有消费掉的情况的大致的流程,调用的顺序就是如果控件式ViewGroup:dispatchTouchEvent(...
  • qq_17265737
  • qq_17265737
  • 2016年10月24日 15:53
  • 127

事件分发 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

转自: http://blog.csdn.net/yanzi1225627/article/details/22592831 细说Android事件...
  • Rodulf
  • Rodulf
  • 2015年12月28日 21:25
  • 93

(4.4.14.1) 细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦。虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子Image...
  • fei20121106
  • fei20121106
  • 2016年04月30日 13:35
  • 377

验证Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

http://blog.csdn.net/yanzi1225627/article/details/22592831 看过这篇微博之后,好像他贴的ViewGroup那部分日志结果有点问题,为了确定结果...
  • u012016068
  • u012016068
  • 2016年01月06日 15:24
  • 471

事件传递机制总结

事件系统组成元素: 1. 每一个事件被包装为一个MotionEvent 2. 描述一个事件的位置(location)     --ACTION_DOWN     --ACTION_UP ...
  • u011176244
  • u011176244
  • 2014年05月17日 09:20
  • 997
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:onTouchEvent事件传递机制总结
举报原因:
原因补充:

(最多只允许输入30个字)