Android--View事件传递
Android--View事件传递
View事件传递首先要明白以下要素:
- 事件就是MotionEvent.该对象包含了传递的事件中的所有信息
- 事件的来源是Window(即PhoneWindow),包含window的是Activity.所以可以认为事件的源头是Activity
- 对事件的操作包括:
- 分发, 通过dispatchTouchEvent()分发
- 拦截, 通过onInterceptTouchEvent()拦截
- 消费、处理, 通过OnTouchListener接口的onTouch()方法监听处理(有限处理监听),通过onTouchEvent()方法处理,先过onTouch,onTouch消费事件则不过onTouchEvent,onTouch方法不消费事件,则过onTouchEvent
- 对事件消费处理的函数:返回true表示消费掉,false表示不消费
- 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,事件都是以 ACTION_DOWN 开始 ACTION_UP 结束,回传的事件是一个事件序列,从ACTION_DOWN到ACTION_UP。必须先消费ACTION_DOWN,才能消费后续的动作,否则后续任何动作都不会被消费!
- 子View可以利用父View的requestDisallowInterceptTouchEvent方法不允许父View拦截事件
基于对以上要素的认识。就可以分析事件分发的流程。
事件分发流程
- 事件的源头从Activity的dispatchTouchEvent方法传递进来,默认Activity总是不消费事件的。所以事件交给PhoneWindow的superDispatchTouchEvent()方法。
- PhoneWindow把事件传递给DecorView(这是界面的根ViewGroup)的superDispatchTouchEvent()方法。
- DecorView按照父类ViewGroup的superDispatchTouchEvent方法处理事件
- 事件在没有被拦截和消费的情况下会逐次传递到下一级的View
- 最后一级的View的onTouchEvent方法会消费掉事件返回true
上面是没有事件拦截的情况。当然事件在从父一级传递到子一级View的时候,父View可以通过onInterceptTouchEvent()拦截事件,停止向下传递。
如果出现最后一级的View没有消费掉事件(OnTouchListener接口的onTouch()方法监听返回false,onTouchEvent()方法返回false),那么事件会依次向父view一级传递。这时候父View一级的onTouchEvent会被调用,要消费就返回true,不消费就返回flase。
如果各个层级的View都不消费事件,那么最后事件会返回到Activity,交给Activity的onTouchEvent方法。
Android--View事件传递的更多相关文章
- Android View事件传递机制
ViewGroup dispatchTouchEvent onInterceptTouchEvent onTouch View dispatchTouchEvent onTouch 假设View的层级 ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)
ViewGroup View Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
- iOS 和 Android 触摸事件传递
先看文章,写得很好 ios 触摸事件传递 http://www.cnblogs.com/Quains/p/3369132.html 另外一篇 http://blog.csdn.net/yongyinm ...
- 【转】Android TouchEvent事件传递机制
Android TouchEvent事件传递机制 事件机制参考地址: http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html ht ...
- Android Touch事件传递机制通俗讲解
在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...
- 初识Android触摸事件传递机制
前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...
- Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- 公共技术点( View 事件传递)
转载地址:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b253e 本文为 Android 开源项目源码解析 公共技术点中的 View 事件传 ...
随机推荐
- 实现一个排序,要求时间效率O(n)
数据大小是在一个范围内的,可以使用常量大小的辅助空间.不得超过O(n); #include "stdafx.h" #include <iostream> #includ ...
- 2014 ACM广东省赛总结
2014年广东省赛在化工大学城开,5月10日开幕式&热身赛,5月11日正式赛. 热身赛的时候,开幕式说有两小时,于是我们愉快的切题了,像平常组队赛那样很快出了两题,但卡在后面两题切不动了.这时 ...
- 细说 CSS margin
作者:https://coding.net/u/zhengkenghong原文:https://blog.coding.net/blog/css-margin 细说 CSS margin 本文着重描述 ...
- string实现
#include<iostream> using namespace std; class String{ friend ostream& operator<&l ...
- 通用后台管理系统UI模板-AdminLTE简介及构造动态菜单栏
AdminLTE是一款基于bootstrap的后台管理系统的通用模板UI,它的样式美观且较为符合大多数后台管理系统的需求,典型的上|左右|下的布局形式.并且提供了一整套我们开发的时候可能用到的UI样式 ...
- 转换为标准IPv4格式
Insus.NET刚写了一个函数,把一个IP地址转换为标准格式,即每段位均是由3个数字组成. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- = ...
- 使用Unity实现动态2D水效果
http://forum.china.unity3d.com/thread-16044-1-1.html 在这片教程里面我们将会用简单的物理效果来模拟动态的2D水效果.我们将会使用Line Rende ...
- 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)
P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...
- 洛谷P2652 同花顺
P2652 同花顺 题目背景 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续. 题目描述 现在我手里有n张扑克牌,但它们可能并不能凑成同花顺.我现在想知道,最少更换其中的多少张牌,我能让这 ...
- 洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)
传送门 这最短路的建图怎么和网络流一样玄学…… 一个最朴素的想法是从每一个点向它能到达的所有点连边,边权为跳的次数,然后跑最短路(然而边数是$O(n^2)$除非自创复杂度比spfa和dijkstra还 ...