Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
http://blog.csdn.net/xyz_lmn/article/details/12517911
Android中触摸事件传递过程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法。这个是困扰初学者的问题之一,我开始也是。这里记录一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的处理过程,以供记忆。
dispatchTouchEvent是处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始的。执行
super.dispatchTouchEvent(ev),事件向下分发。
onInterceptTouchEvent是ViewGroup提供的方法,默认返回false,返回true表示拦截。
onTouchEvent是View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。
View里,有两个回调函数 :
- public boolean dispatchTouchEvent(MotionEvent ev);
- public boolean onTouchEvent(MotionEvent ev);
ViewGroup里,有三个回调函数 :
- public boolean dispatchTouchEvent(MotionEvent ev);
- public boolean onInterceptTouchEvent(MotionEvent ev);
- public boolean onTouchEvent(MotionEvent ev);
在Activity里,有两个回调函数 :
- public boolean dispatchTouchEvent(MotionEvent ev);
- public boolean onTouchEvent(MotionEvent ev);
Android中默认情况下事件传递是由最终的view的接收到,传递过程是从父布局到子布局,也就是从Activity到ViewGroup到View的过程,默认情况,ViewGroup起到的是透传作用。Android中事件传递过程(按箭头方向)如下图,图片来自[qiushuiqifei],谢谢[qiushuiqifei]整理。
触摸事件是一连串ACTION_DOWN,ACTION_MOVE..MOVE…MOVE、最后ACTION_UP,触摸事件还有ACTION_CANCEL事件。事件都是从ACTION_DOWN开始的,Activity的dispatchTouchEvent()首先接收到ACTION_DOWN,执行super.dispatchTouchEvent(ev),事件向下分发。
dispatchTouchEvent()返回true,后续事件(ACTION_MOVE、ACTION_UP)会再传递,如果返回false,dispatchTouchEvent()就接收不到ACTION_UP、ACTION_MOVE。
下面的几张图参考自[eoe]
图1.ACTION_DOWN都没被消费
图2-1.ACTION_DOWN被View消费了
图2-2.后续ACTION_MOVE和UP在不被拦截的情况下都会去找VIEW
图3.后续的被拦截了
图4ACTION_DOWN一开始就被拦截
android中的Touch事件都是从ACTION_DOWN开始的:
单手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP
多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.
Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()相关推荐
- Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
[转]http://blog.csdn.net/guitk/article/details/7057155 onInterceptTouchEvent用于改变事件的传递方向.决定传递方向的是返回值,返 ...
- Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理
在Android中需要经常对用户手势进行判断,在判断手势时需要精细的分清楚每个触摸事件以及每个View对事件的接收情况,在View,ViewGroup,Activity中都可以接收事件,在对事件进行处 ...
- android的dispatchTouchEvent onInterceptTouchEvent onTouchEvent
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件: ACTION_DOWN ...
- android touch机制,细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)...
本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦.虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子Image ...
- dispatchTouchEvent onInterceptTouchEvent onTouchEvent区分
1. dispatchTouchEvent 是处理触摸事件分发,执行super.dispatchTouchEvent(ev),事件向下分发. 2. onInterceptTouchEvent是 ...
- MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序
onInterceptTouchEvent()用于处理事件并改变事件的传递方向.处理事件这个不用说了,你在函数内部编写代码处理就可以了.而决定传递方向的是返回值,返回为false时事件会传递给子控件的 ...
- dispatchTouchEvent onInterceptTouchEvent onTouchEvent
http://www.cnblogs.com/jqyp/archive/2012/04/25/2469758.html dispatchTouchEvent 分发 onInterceptT ...
- Android中事件的传递
Android中事件的传递 首先来张图看看 1. 核心方法返回值的含义 dispatchTrackballEvent 分发事件 public boolean dispatchTrackballE ...
- android viewgroup 事件,android中viewgroup的事件传递分析
在上一篇中我们分析了从view的dispatchTouchEvent到onTouchListener的onTouch回调到onTouchEvent到onClickLisener的onClickandr ...
最新文章
- 犟泥巴php集训营,想要开发自己的PHP框架需要那些知识储备?
- php dir opendir,php opendir()列出目录下文件的方法代码
- ubuntu mysql5.6 编译安装_Ubuntu14.04编译安装mysql5.6.26
- Pandas与openpyxl库的 完美 融合!
- 三款运用二维码分享与预览的原型设计工具
- 经典的十个机器学习算法
- OpenShift Redhat的使用和介绍
- oracle角色与权限
- 数字电平(一):TTL和CMOS
- LayoutIt! 设计Bootstrap页面
- Kconfig使用介绍
- php加入购物车怎样实现_php简单实现加入购物车功能案例
- MFC自绘带背景颜色标题栏
- 【计算机网络】(4)什么是路由+ARP协议
- 如何无损合并video.m4s与audio.m4s为mp4文件
- [集中式] SVN的安装与详细使用教程
- openlayers 展示gif的2种方案
- 学前教育专业计算机实训室,学前教育模拟实训室
- nmap oracle,[转帖]如何使用nmap扫描工具
- 丰田和软银合作开发自动驾驶汽车相关服务
热门文章
- 将已有项目提交到github/从github上pull到本地
- 在windows7下安装CentOS
- Oracle 11g Release 1 (11.1) Data Pump 导入模式
- [转载] 杜拉拉升职记——33 360度评估
- 一起谈.NET技术,在没有安装 ASP.NET MVC3 的服务器上运行 MVC3
- Wireshark运算符!=无法正常工作
- 自定义变量 配置文件_跟我一起学.NetCore之自定义配置源热更新对象绑定
- cuda 本地内存使用_CUDA 基础知识博客整理
- oracle中spool卸数,Oracle中如何快速的卸载和加载数据?
- 财务学习mysql_从零开始学 MySQL - 前言