Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
来源:互联网 发布:windows通配符命令 编辑:程序博客网 时间:2024/05/19 22:25
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);
- 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.
转载地址:http://blog.csdn.net/xyz_lmn/article/details/12517911
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- iOS 闹钟app源代码
- DIV样式汇总
- MHA+Lvs+Keepalived实现MySQL的高可用及读负载均衡_4(Lvs+Keepalived)
- android ADB学习记录
- Launcher2 快捷方式图标的圆角处理及解析
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- javascript基本类型 引用类型 基本包装类型
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(二)
- Android中R文件的丢失问题
- Android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- 多文档中获得停靠窗口以及子对话框以及其内控件指针
- AJaxBeginForm ,Ajax,HtmlBegin 什么时候用
- GDB基本命令(整合)
- x86服务器(HP/DELL/IBM)测试分析(下)