Android的touchEvent的消费过程
2013-03-18 14:44
393 查看
现在的移动设备,最最主流的交互方式就是手指触摸屏幕了啦,当然语音输入,传感器识别也是移动终端上常用的交互方式。要想写好移动端的程序,了解操作系统如何处理触摸事件的整个过程是至关重要的。
大家都知道ViewGroup类是继承View类的,也就是说ViewGroup其实也是一个View,但ViewGroup的主要功能当然是作为一个容器,可以装载其它的View。
写应用层程序,大多数时候我们只关心我们的View是如何来处理一个TouchEvent的就行了,当然要深入了解操作系统的触摸事件消息读取队列对于提升我们的编程境界会更有帮助(目前我是没有这个境界的)。
先来说说我们的应用程序布局,大多数情况下根节点都是一个ViewGroup(如LinearLayout,RelativeLayout),然后在里面再装载着各种各样的View(Button,TextView,XXXLayout等)。当有TouchEvent产生时,系统会把TouchEvent传递给当前活跃的Application来处理,如果当前的Application没有消费该事件,或者是该事件不在Application的有效界面内(例如点击通知栏),则交由系统来处理。(这里有点想当然了,没有看过底层源码)。
如果TouchEvent在当前活跃的Application有效界面内,则交由当前处于栈顶的activity来处理,activity将TouchEvent分发(dispatch)给RootView来处理,rootView一般说来也就是当前布局的根节点。
分发一个TouchEvent给一个View来处理调用的是View的dispatchTouchEvent()方法。假设当前的根节点是一个ViewGroup, 则默认情况下会做如下处理
如果当前viewGroup监听了TouchListener且是enabled则调用TouchListener的onTouch方法来处理,如果onTouch方法返回true,表示消费了该事件,返回true给上层。否则调用自身的onTouchEvent(ev)事件。View的onTouchEvent也就是处理生成click或者longclick等事件,根据响应的时间或者具体触摸点生成相应的事件,具体可看源码。
通过上面的描述,我们就大概了解了触摸事件的消费过程,消费了返回true,否则返回false,传递给上层处理。如果我们想做额外的处理,就要拷贝一份当前的event,然后再继续往下传递,,如果我们想取消向下传递,可以将event设为ACTION_CANCEL或者在onInterceptTouchEvent里面返回true进行拦截。
大家都知道ViewGroup类是继承View类的,也就是说ViewGroup其实也是一个View,但ViewGroup的主要功能当然是作为一个容器,可以装载其它的View。
写应用层程序,大多数时候我们只关心我们的View是如何来处理一个TouchEvent的就行了,当然要深入了解操作系统的触摸事件消息读取队列对于提升我们的编程境界会更有帮助(目前我是没有这个境界的)。
先来说说我们的应用程序布局,大多数情况下根节点都是一个ViewGroup(如LinearLayout,RelativeLayout),然后在里面再装载着各种各样的View(Button,TextView,XXXLayout等)。当有TouchEvent产生时,系统会把TouchEvent传递给当前活跃的Application来处理,如果当前的Application没有消费该事件,或者是该事件不在Application的有效界面内(例如点击通知栏),则交由系统来处理。(这里有点想当然了,没有看过底层源码)。
如果TouchEvent在当前活跃的Application有效界面内,则交由当前处于栈顶的activity来处理,activity将TouchEvent分发(dispatch)给RootView来处理,rootView一般说来也就是当前布局的根节点。
分发一个TouchEvent给一个View来处理调用的是View的dispatchTouchEvent()方法。假设当前的根节点是一个ViewGroup, 则默认情况下会做如下处理
转换代码public boolean dispatchTouchEvent(MotionEvent event) { if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, event)) { return true; } return onTouchEvent(event); }
如果当前viewGroup监听了TouchListener且是enabled则调用TouchListener的onTouch方法来处理,如果onTouch方法返回true,表示消费了该事件,返回true给上层。否则调用自身的onTouchEvent(ev)事件。View的onTouchEvent也就是处理生成click或者longclick等事件,根据响应的时间或者具体触摸点生成相应的事件,具体可看源码。
通过上面的描述,我们就大概了解了触摸事件的消费过程,消费了返回true,否则返回false,传递给上层处理。如果我们想做额外的处理,就要拷贝一份当前的event,然后再继续往下传递,,如果我们想取消向下传递,可以将event设为ACTION_CANCEL或者在onInterceptTouchEvent里面返回true进行拦截。
相关文章推荐
- Android的touchEvent的消费过程
- Android的touchEvent的消费过程
- iOS的touchEvent的消费过程
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
- android事件的分发和消费机制(onTouchEvent())
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
- 从源码角度带你分析 Android View 事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程(一)
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
- Android View系统源码分析(三)—— 根View内部消息派发过程&ViewGroup.dispatchTouchEvent()
- Android 编程下 Touch 事件的分发和消费机制Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onIntercep
- android TouchEvent 传递过程
- Android FrameWork——Touch事件派发过程详解
- Android 编程下 Touch 事件的分发和消费机制(下)
- Android onInterceptTouchEvent()和onTouchEvent()例子和总结
- android onInterceptTouchEvent和onTouchEvent
- Android TouchEvent 的传递顺序
- [Android面试题-10] TouchEvent的分发和截获方式
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()