Android--View事件传递

View事件传递首先要明白以下要素:

  1. 事件就是MotionEvent.该对象包含了传递的事件中的所有信息
  2. 事件的来源是Window(即PhoneWindow),包含window的是Activity.所以可以认为事件的源头是Activity
  3. 对事件的操作包括:
    1. 分发, 通过dispatchTouchEvent()分发
    2. 拦截, 通过onInterceptTouchEvent()拦截
    3. 消费、处理, 通过OnTouchListener接口的onTouch()方法监听处理(有限处理监听),通过onTouchEvent()方法处理,先过onTouch,onTouch消费事件则不过onTouchEvent,onTouch方法不消费事件,则过onTouchEvent
  4. 对事件消费处理的函数:返回true表示消费掉,false表示不消费
  5. 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,事件都是以 ACTION_DOWN 开始 ACTION_UP 结束,回传的事件是一个事件序列,从ACTION_DOWN到ACTION_UP。必须先消费ACTION_DOWN,才能消费后续的动作,否则后续任何动作都不会被消费!
  6. 子View可以利用父View的requestDisallowInterceptTouchEvent方法不允许父View拦截事件

基于对以上要素的认识。就可以分析事件分发的流程。

事件分发流程

  1. 事件的源头从Activity的dispatchTouchEvent方法传递进来,默认Activity总是不消费事件的。所以事件交给PhoneWindow的superDispatchTouchEvent()方法。
  2. PhoneWindow把事件传递给DecorView(这是界面的根ViewGroup)的superDispatchTouchEvent()方法。
  3. DecorView按照父类ViewGroup的superDispatchTouchEvent方法处理事件
  4. 事件在没有被拦截和消费的情况下会逐次传递到下一级的View
  5. 最后一级的View的onTouchEvent方法会消费掉事件返回true

上面是没有事件拦截的情况。当然事件在从父一级传递到子一级View的时候,父View可以通过onInterceptTouchEvent()拦截事件,停止向下传递。

如果出现最后一级的View没有消费掉事件(OnTouchListener接口的onTouch()方法监听返回false,onTouchEvent()方法返回false),那么事件会依次向父view一级传递。这时候父View一级的onTouchEvent会被调用,要消费就返回true,不消费就返回flase。

如果各个层级的View都不消费事件,那么最后事件会返回到Activity,交给Activity的onTouchEvent方法。

Android--View事件传递的更多相关文章

  1. Android View事件传递机制

    ViewGroup dispatchTouchEvent onInterceptTouchEvent onTouch View dispatchTouchEvent onTouch 假设View的层级 ...

  2. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  3. Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)

      ViewGroup View  Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...

  4. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

  5. iOS 和 Android 触摸事件传递

    先看文章,写得很好 ios 触摸事件传递 http://www.cnblogs.com/Quains/p/3369132.html 另外一篇 http://blog.csdn.net/yongyinm ...

  6. 【转】Android TouchEvent事件传递机制

    Android TouchEvent事件传递机制   事件机制参考地址: http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html ht ...

  7. Android Touch事件传递机制通俗讲解

    在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...

  8. 初识Android触摸事件传递机制

    前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...

  9. Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  10. 公共技术点( View 事件传递)

    转载地址:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b253e 本文为 Android 开源项目源码解析 公共技术点中的 View 事件传 ...

随机推荐

  1. Synchronized之二:synchronized的实现原理

    Java提供了synchronized关键字来支持内在锁.Synchronized关键字可以放在方法的前面.对象的前面.类的前面. 当线程调用同步方法时,它自动获得这个方法所在对象的内在锁,并且方法返 ...

  2. cocos2dx unzip、createDir

    转自:http://www.cnblogs.com/xioapingguo/p/4037323.html static unsigned long _maxUnzipBufSize = 0x50000 ...

  3. Redis 教程笔记

    简介: 开源BSD.key-value数据库.数据持久化(可将内存数据保存到磁盘中),提供多种数据结构. 支持数据备份(master-slave模式) 优势: 性能高.数据类型丰富.原子性.其他 Re ...

  4. JavaScript中两个数组的拼接

    方法一:使用for循环 var arr = ['tom', 'jerry']; var arr2 = [1, 2]; for(var i=0; i<arr2.length; i++){ arr. ...

  5. ue4 delegate event

    官网相关 https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Delegates/index.html wi ...

  6. Unite Europe案例项目《影子战术》层级优化经验分享

    http://forum.china.unity3d.com/thread-25087-1-9.html 在Unite Europe 2017的Keynote主题演讲中,我们为大家分享了将主机游戏&l ...

  7. CentOS设置代理, yum, wget

    /etc # vi yum.conf [main] cachedir=/var/cache/yum/basearch/releasever keepcache=0 debuglevel=2 logfi ...

  8. 洛谷P3797 妖梦斩木棒

    P3797 妖梦斩木棒 题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看 ...

  9. 洛谷P2759 奇怪的函数

    P2759 奇怪的函数 题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^x 达到 n 位数字的最小正整数 x ...

  10. Request a certificate from a certificate vendor

    Request a certificate from a certificate vendor Now, with your CSR in hand, visit the Web site of yo ...