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. 实现一个排序,要求时间效率O(n)

    数据大小是在一个范围内的,可以使用常量大小的辅助空间.不得超过O(n); #include "stdafx.h" #include <iostream> #includ ...

  2. 2014 ACM广东省赛总结

    2014年广东省赛在化工大学城开,5月10日开幕式&热身赛,5月11日正式赛. 热身赛的时候,开幕式说有两小时,于是我们愉快的切题了,像平常组队赛那样很快出了两题,但卡在后面两题切不动了.这时 ...

  3. 细说 CSS margin

    作者:https://coding.net/u/zhengkenghong原文:https://blog.coding.net/blog/css-margin 细说 CSS margin 本文着重描述 ...

  4. string实现

    #include<iostream> using namespace std;   class String{     friend ostream& operator<&l ...

  5. 通用后台管理系统UI模板-AdminLTE简介及构造动态菜单栏

    AdminLTE是一款基于bootstrap的后台管理系统的通用模板UI,它的样式美观且较为符合大多数后台管理系统的需求,典型的上|左右|下的布局形式.并且提供了一整套我们开发的时候可能用到的UI样式 ...

  6. 转换为标准IPv4格式

    Insus.NET刚写了一个函数,把一个IP地址转换为标准格式,即每段位均是由3个数字组成. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- = ...

  7. 使用Unity实现动态2D水效果

    http://forum.china.unity3d.com/thread-16044-1-1.html 在这片教程里面我们将会用简单的物理效果来模拟动态的2D水效果.我们将会使用Line Rende ...

  8. 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)

    P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...

  9. 洛谷P2652 同花顺

    P2652 同花顺 题目背景 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续. 题目描述 现在我手里有n张扑克牌,但它们可能并不能凑成同花顺.我现在想知道,最少更换其中的多少张牌,我能让这 ...

  10. 洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)

    传送门 这最短路的建图怎么和网络流一样玄学…… 一个最朴素的想法是从每一个点向它能到达的所有点连边,边权为跳的次数,然后跑最短路(然而边数是$O(n^2)$除非自创复杂度比spfa和dijkstra还 ...