转自: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(安卓)中如何处理双击事件
  2. Android高仿网易新闻客户端之动态添加标签
  3. cocos2dx android平台事件系统解析
  4. Android-防止事件导致的oncreate的多次调用
  5. Android(安卓)UI架构(四)--SurfaceFlinger的初始化.md
  6. Android输入法之输入系统
  7. Android(安卓)View绘制过程以及事件传递原理
  8. 【android】点击事件穿透解决方案
  9. Android事件分发机制全解析

随机推荐

  1. Android系统启动流程(一)解析init进程启动
  2. Handler.post(action)方法
  3. [Android NDK]Android JNI开发例子 ---3
  4. Android studio3.x 多渠道打包apk
  5. Android Chromium WebView html js 开发
  6. android(NDK+JNI)---Eclipse+CDT+gdb调试
  7. 关于Android Studio3.2新建项目Android r
  8. android 获取唯一标识
  9. 解决“Connection to https://dl-ssl.goo
  10. 浅析Android中的消息机制-解决:Only the o