Android TouchEvent 分发流程
来源:互联网 发布:sql的truncate函数 编辑:程序博客网 时间:2024/04/29 14:31
消息分发
动作序列的三个事件
TouchEvent 分三种事件:down、move、up。
其中move事件在一个操作中(这里说的一个操作就是用户与屏幕的交互,即由down到up的动作序列)可能会发生多次。
但是,我们认为一个动作序列会包含以上三种事件,因此,在事件处理中就是要处理好这个过程,而最重要的就是down事件,这是一个动作序列的起始,没有down谈不上后面的事件了。
所以,我们把消耗down事件的类当做是这个动作序列的最终载体。
如果Down事件不归你处理,那这个动作序列的move,up也不归你处理。
他们的触发顺序会是这样:
ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
从父到子的消息分发流程
Android 消息队列的分发流程是
Activity -> ViewGroup1 -> ViewGroup1的直接子ViewGroup –> ×××××× -> 叶子View
消息和处理的一一对应
一个消息,默认消息都只需要一个控件来处理。中间消息途径的都只是起中转的效果,不做处理。处理完成直接返回了,不会通知中间步骤。
如果一个消息想改成多个控件都处理,则需要修改这里的逻辑
消息处理流程,从子到父
如果消息处理一直返回的是 false。
则一直是从子到父的依次处理。处理到没有可以处理的人了,或者返回了true到此为止。
比如:
如果一个Activity调用一个View,那么首先执行的是View中的onTouchEvent(MotionEvent event),如果返回false,
再执行Activity中的onTouchEvent(MotionEvent event),
否则不执行Activity中的onTouchEvent(MotionEvent event);
但是如果是触摸屏幕的标题栏的时候,执行的是Activity中onTouchEvent(MotionEvent event)。
Android 事件分发处理策略
Activity与View控件的分发流程有所区别,首先我们介绍 ViewGroup 的分发流程
Android ViewGroup分发处理原则
- 默认情况,一个消息最后只需要一个人处理,其它消息途径者都只是干了中转的效果。
- 消息传递途径三级处理机制:
- 接受上级消息(dispatchTouchEvent),
- 决策向下级分发还是自身处理(onInterceptTouchEvent),
- 自身处理逻辑(onTouchEvent、onTouch 、onClick 、onLongClick 等)
- View内部自身处理逻辑先后顺序,依次是:(注:在return不为true的情况下)
- onTouchEvent
- onClick
- onLongClick
- OnTouchListener onTouch onTouchEvent 的区别
- 首先执行OnTouchListener()中的onTouch,然后执行重写的onTouchEvent(MotionEvent event)。(注:在return不为true的情况下)
- onTouch() is used by users of the View to get touch events while onTouchEvent() is used by derived classes of the View to get touch events.
- 更详细的可以看 http://blog.csdn.net/ddna/article/details/5451722
- 消息处理中, return true 表示消息被完整地处理完成了,后面不用再用其他事件处理了。
View,ViewGroup 的分发处理逻辑
- dispatchTouchEvent
接受上级传递过来的消息
抽象对象的对外调用接口。
对外部来说,只知道这个接口,不知道其他。相当于企业门卫,邮递员是把信给门卫的。
1、返回值:false
不接受动作序列中的后续事件
我们一般遇到事件有3种,分别是:Down、move、up False表示不接受动作序列中的后续事件,因此本次后续操作不起作用, 如:down后返回false,则move和up都不会被接受,只能接受下个动作。
2、返回值:true
继续接受动作序列中的后续事件,如move、up
其中如果调用了Super.dispatchTouchEvent。 这样就会继续调用onInterceptTouchEvent事件。
如果返回值是 Super.dispatchTouchEvent ,意味着由onInterceptTouchEvent决定事件流向,
Super.dispatchTouchEvent 的返回值就是系统默认的,系统默认最终只有一个控件处理这个消息。
如果需要多个控件同时处理,则一定需要返回true,并调用Super.dispatchTouchEvent
- onInterceptTouchEvent
相当其企业的内勤,负责分发信件。
不过要注意的是,一旦动作序列的down事件知道了该如何分发,下次就会绕过它
返回值:true
自己处理,不需要继续下传
事件会传递到自己的onTouchEvent()
Down事件在onInterceptTouchEvent()后返回true,则传递到onTouchEvent,
当其返回true时,动作序列的后续事件不会再通过onInterceptTouchEvent了,而是在dispatchTouchEvent中直接传递于onTouchEvent。
返回值:false
自己无法完全处理,或者不能处理,继续下传
传递到下一个view的dispatchTouchEvent()
onInterceptTouchEvent返回false应该传给下个子view的dispatchTouchEvent,但是,点击的叶子节点view,因此不存在子view而直接传给自己的onTouchEvent
onInterceptTouchEvent要做的就是确定事件传递到哪个子view,如果返回false,又没有子view处理(因为根本就没有点击到子view),就自己处理了,而自己在onTouchEvent处理的后续事件就不必经过onInterceptTouchEvent了,它是判断传递给子view的,都不是子view处理,就不用经过了。
- onTouchEvent
- 实现View.OnClickListener 的onClick
- 实现View.OnLongClickListener 的 onLongClick
- 实现View.OnTouchClickListener 的 onTouch
这里有个先后顺序。
如果先工作的把这件事情结束了,就不会继续传递下去了。
如果我们在一个View中同时覆写了onClick、onLongClick及onTouchEvent的话,onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick或者onLongClick。
返回值 true和false在其中起着标志事件是否被消耗,
如果消耗了就不再传递给其他控件了。
如果没有消耗则还会传递给其他控件,触发其他控件的事件处理函数。
参考资料
Android onTouchEvent, onClick及onLongClick的调用机制
http://blog.csdn.net/ddna/article/details/5451722
android 事件处理
http://blog.csdn.net/leesidong/article/details/6973261
Android FrameWork——Touch事件派发过程详解
http://blog.csdn.net/stonecao/article/details/6759189
Android中Touch事件的处理逻辑
http://www.oschina.net/question/163910_27289
- Android TouchEvent 分发流程
- Android TouchEvent 分发流程
- Android TouchEvent 分发流程
- Android TouchEvent 分发流程
- Android TouchEvent 分发流程
- Android TouchEvent 分发流程
- Android TouchEvent 分发流程
- Android TouchEvent 分发流程
- Android TouchEvent分发
- android TouchEvent事件分发
- android TouchEvent 处理流程
- android TouchEvent处理流程分析
- 理解Android中的TouchEvent事件分发机制
- Android 事件分发keyEvent、touchEvent、hoverEvent
- Android 事件分发keyEvent、touchEvent、hoverEvent
- android处理触摸(touchEvent)详细流程
- Android处理触摸(touchEvent)详细流程
- android处理触摸(touchEvent)详细流程
- oracle存储大数据类型(Clob/Blob)
- Windows下安装Qt
- 2013年CSDN高校俱乐部全国百所高校巡讲讲师招募
- 【阅读笔记】关于Direct3D初始化的一个完整工程及介绍
- Java中IO处理类介绍
- Android TouchEvent 分发流程
- 中断 Linux 中断学习之前言篇
- 禁止锁屏,保持唤醒--通话的灯光控制
- 在数据库中根据经纬度查找数据中所有附近的经纬度点
- 如何加大网站流量
- Windows IPC 应用移植到 Linux,第1部分:进程和线程
- crontab 任务日志
- 新浪微博安卓SDKexample,认证错误,Sorry, that page doesnot exist!
- 关于arcpy中的Cursor,for循环问题