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里,有两个回调函数 :

[java] view plaincopy print?
  1. public boolean dispatchTouchEvent(MotionEvent ev);
  2. public boolean onTouchEvent(MotionEvent ev);

ViewGroup里,有三个回调函数 :

[java] view plaincopy print?
  1. public boolean dispatchTouchEvent(MotionEvent ev);
  2. public boolean onInterceptTouchEvent(MotionEvent ev);
  3. public boolean onTouchEvent(MotionEvent ev);

在Activity里,有两个回调函数 :

[java] view plaincopy print?
  1. public boolean dispatchTouchEvent(MotionEvent ev);
  2. 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()相关推荐

  1. Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解

    [转]http://blog.csdn.net/guitk/article/details/7057155 onInterceptTouchEvent用于改变事件的传递方向.决定传递方向的是返回值,返 ...

  2. Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理

    在Android中需要经常对用户手势进行判断,在判断手势时需要精细的分清楚每个触摸事件以及每个View对事件的接收情况,在View,ViewGroup,Activity中都可以接收事件,在对事件进行处 ...

  3. android的dispatchTouchEvent onInterceptTouchEvent onTouchEvent

    android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解.  一个最简单的屏幕触摸动作触发了一系列Touch事件: ACTION_DOWN ...

  4. android touch机制,细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)...

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

  5. dispatchTouchEvent onInterceptTouchEvent onTouchEvent区分

      1. dispatchTouchEvent 是处理触摸事件分发,执行super.dispatchTouchEvent(ev),事件向下分发.   2. onInterceptTouchEvent是 ...

  6. MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序

    onInterceptTouchEvent()用于处理事件并改变事件的传递方向.处理事件这个不用说了,你在函数内部编写代码处理就可以了.而决定传递方向的是返回值,返回为false时事件会传递给子控件的 ...

  7. dispatchTouchEvent onInterceptTouchEvent onTouchEvent

    http://www.cnblogs.com/jqyp/archive/2012/04/25/2469758.html dispatchTouchEvent       分发 onInterceptT ...

  8. Android中事件的传递

    Android中事件的传递 首先来张图看看    1. 核心方法返回值的含义 dispatchTrackballEvent 分发事件 public boolean dispatchTrackballE ...

  9. android viewgroup 事件,android中viewgroup的事件传递分析

    在上一篇中我们分析了从view的dispatchTouchEvent到onTouchListener的onTouch回调到onTouchEvent到onClickLisener的onClickandr ...

最新文章

  1. 犟泥巴php集训营,想要开发自己的PHP框架需要那些知识储备?
  2. php dir opendir,php opendir()列出目录下文件的方法代码
  3. ubuntu mysql5.6 编译安装_Ubuntu14.04编译安装mysql5.6.26
  4. Pandas与openpyxl库的 完美 融合!
  5. 三款运用二维码分享与预览的原型设计工具
  6. 经典的十个机器学习算法
  7. OpenShift Redhat的使用和介绍
  8. oracle角色与权限
  9. 数字电平(一):TTL和CMOS
  10. LayoutIt! 设计Bootstrap页面
  11. Kconfig使用介绍
  12. php加入购物车怎样实现_php简单实现加入购物车功能案例
  13. MFC自绘带背景颜色标题栏
  14. 【计算机网络】(4)什么是路由+ARP协议
  15. 如何无损合并video.m4s与audio.m4s为mp4文件
  16. [集中式] SVN的安装与详细使用教程
  17. openlayers 展示gif的2种方案
  18. 学前教育专业计算机实训室,学前教育模拟实训室
  19. nmap oracle,[转帖]如何使用nmap扫描工具
  20. 丰田和软银合作开发自动驾驶汽车相关服务

热门文章

  1. 将已有项目提交到github/从github上pull到本地
  2. 在windows7下安装CentOS
  3. Oracle 11g Release 1 (11.1) Data Pump 导入模式
  4. [转载] 杜拉拉升职记——33 360度评估
  5. 一起谈.NET技术,在没有安装 ASP.NET MVC3 的服务器上运行 MVC3
  6. Wireshark运算符!=无法正常工作
  7. 自定义变量 配置文件_跟我一起学.NetCore之自定义配置源热更新对象绑定
  8. cuda 本地内存使用_CUDA 基础知识博客整理
  9. oracle中spool卸数,Oracle中如何快速的卸载和加载数据?
  10. 财务学习mysql_从零开始学 MySQL - 前言