http://blog.csdn.net/xyz_lmn/article/details/12517911


Android中触摸事件传递过程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法。这个是困扰初学者的问题之一,我开始也是。这里记录一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的处理过程,以供记忆。


dispatchTouchEvent是处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始的。执行

super.dispatchTouchEvent(ev),事件向下分发。

onInterceptTouchEventViewGroup提供的方法,默认返回false,返回true表示拦截。

onTouchEvent是View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。


View里,有两个回调函数

[java] view plain copy print ?
  1. publicbooleandispatchTouchEvent(MotionEventev);
  2. publicbooleanonTouchEvent(MotionEventev);

ViewGroup里,有三个回调函数

[java] view plain copy print ?
  1. publicbooleandispatchTouchEvent(MotionEventev);
  2. publicbooleanonInterceptTouchEvent(MotionEventev);
  3. publicbooleanonTouchEvent(MotionEventev);


在Activity里,有两个回调函数

[java] view plain copy print ?
  1. publicbooleandispatchTouchEvent(MotionEventev);
  2. publicbooleanonTouchEvent(MotionEventev);


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.


更多相关文章

  1. android中MotionEvent.ACTION_CANCEL事件如何被触发?
  2. Android点击事件的四种写法
  3. android事件处理的三种方式
  4. 2011.09.01(2)——— android 处理双击事件
  5. android中文api(79)——Gallery
  6. 2011.09.01(2)——— android 处理双击事件
  7. Android之Input子系统事件分发流程
  8. Android(安卓)关于 OnScrollListener 事件顺序次数的简要分析
  9. Android设置“android:clickable="false"无效。点击事件依旧触发

随机推荐

  1. 在Windows环境下安装MySQL 的教程图解
  2. 简单了解mysql mycat 中间件
  3. mysql如何在已有数据库上统一字符集
  4. 简单了解添加mysql索引的3条原则
  5. 简单了解操作mysql数据库的命令行神器myc
  6. MySQL分表和分区的具体实现方法
  7. mysql 5.7.17 winx64解压版安装配置方法
  8. Windows下mysql community server 8.0.16
  9. java连不上mysql8.0问题的解决方法
  10. mysql server 5.5连接不上的解决方法