dispatchTouchEvent,onTouchEvent与onInterceptTouchEvent
1.首先明白一个常识:View 没有onInterceptTouchEvent事件,而ViewGroup这三个事件都有,是viewgroup继承View之后才加了一个方法叫onIntercepTouchEvent。
从字面意思可以看出,onInterceptTouchEvent是拦截器,用来拦截事件用的,dispatchTouchEvent是用来分发事件的,onTouchEvent是用来处理事件的。
大家不难看出,应该是先走dispatchTouchEvent然后走onTouchEvent。那OnInterceptTouchEven的调用时机是什么时候呢?为了更好的理解这三个事件,我们从简单到复杂,先从一个子view,一个viewgroup,然后viewgroup里有子view。
2.针对一个View来讲,事件是先走该View的dispatchTouchEvent,然后再走onTouchEvent(也有可能不走)。
什么时候不会走onTouchEvent呢?当重写dispatchTouchEvent,不走super.dispatchTouchEvent直接返回false,它就不会走onTouchEvent。
当然这样做是违反android架构常理的,一般的dispatchTouchEvent是不建议重写的。不过通过这个案例我们可以总结出这么一个结论.
在事件到达view的时候,先走dispatchTouchEvent,在系统的dispatchTouchEvent中它会调用该view的Ontouch方法如果此onTouch方法的down事件里返回true,则
dispatchTouchEvent方法也返回true,且把以后的move事件,up事件都传给onTouch。之后的move事件及up事件的返回值,onTouch返回什么dispatchTouchEvent也返回什么。
相反如果传第一个down事件给ontouch的时候,ontouch返回的是false,从此事件不再会传过来,也就是不会走dispatchTouchEvent。更不会走ontouchevent
3.针对一个ViewGroup来讲(没有子view的时候):
事件的走向是dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent
我们会发现它们的逻辑跟view 的没什么两样,只是在走down事件的时候onInterceptTouchEvent会在中间,而这里不管onInterceptTouchEvent返回什么都不会干扰它像2.形容的那
样运行,难道onInterceptTouchEvent这个方法没用?
4.当Viewgroup里有子view的时候
down事件走向:viewgroup.dispatchTouchEvent->viewgroup.onInterceptTouchEvent ->如果返回true->viewgroup.onTouch-------------------------------分支1
|->如果返回false->view.dispatchTouchEvent分支2
分支1:之后的move或up事件的走向是:viewgroup.dispatchTouchEvent->viewgroup.ontouch 这里不管ontouch返回的是什么都是这个走向
分支2:down事件到了view.dispatchTouchEvent->view.onTouch->返回true->分支3
|->返回false->viewgroup.ontouch->返回true->move,up等事件viewgroup.dispatchTouchEvent-
|->返回false,则该viewgroup不会再收到后续事件了
>viewgroup.ontouch
分支3:子view的onTOuch返回true了,表示子view能接受该事件,今后的事件走向是
Move:viewgroup.dispatchTouchEvent->viewgroup.onInterceptTouchEvent返回?
如果返回的是false,以后的move,up都这么走viewgroup.dispatchTouchEvent->viewgroup.onInterceptTouchEvent->view.dispatchTouchEvent->view.ontouch
如果返回的是true,抢夺子view的move事件接下来的走向是:强制传Cancel事件和UP事件给view,view.dispatchTouchEvent->view.ontouch(无视它返回什么)->然后把Move事件留给viewgroup:viewgroup.dispatchTouchEvent->viewgroup.ontouch
这个现象大家应该在listview或是scrollview里见过,就是当用户在scrollview里按住一个按钮,发现按钮做了相应反应(按钮高亮了),但当按住不放拖它时,发现界面在滚动,这就是因为onInterceptTouchEvent抢事件了!
如果有时间我会做一个app来验证以上的。谢谢大家
转至:http://www.eoeandroid.com/thread-262615-1-1.html
dispatchTouchEvent,onTouchEvent与onInterceptTouchEvent的更多相关文章
- 事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序
一直想弄清楚onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent的执行顺序,以及内部使用switch (event.getAction())中的执 ...
- 关于dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的分发机制浅析
虽说这个问题不是很难...动动手就能看出答案...但是似乎不太容易理解...几次尝试把这个问题说明白....但是好像感觉说不明白....(顿时想起了那句话----说不明白就是自己还不明白! 我怎么可能 ...
- Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
Android事件分发机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 Android事件分发机制的发生在Vi ...
- Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...
- ontouch、dispatchtouchevent、interceptouchevent-相关事件
这几天一直在研究onTouch的相关方法,今天我们就来看看onTouchEvent.dispatchTouchEvent.onIntercepTouchEvent这三个方法在控件之间的传递顺序 pub ...
- 札记:android手势识别,MotionEvent
摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势T ...
- android 事件分发机制详解(OnTouchListener,OnClick)
昨天做东西做到触摸事件冲突,以前也经常碰到事件冲突,想到要研究一下Android的事件冲突机制,于是从昨天开始到今天整整一天时间都要了解这方面的知识,这才懂了安卓的触摸和点击事件的机制.探究如下: 首 ...
- 简单例子了解View的事件分发
什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...
- 通俗理解Android事件分发与消费机制
深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...
随机推荐
- Vuex 使用了 module 后的访问方法 ..
如果 使用了 module 和 namespace state 数据:=> this.$store.state.User.info (user 是模块名字. info 是 state 里 ...
- bytes和str之间的转换
1.方法:decode解码(二进制转换成字符串) encode与上相反
- 【算法笔记】B1026 程序运行时间
1026 程序运行时间 (15 分) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗 ...
- HDU_1028 Ignatius and the Princess III 【母函数的应用之整数拆分】
题目: "Well, it seems the first problem is too easy. I will let you know how foolish you are late ...
- Mutation and Iteration
avoid mutating a list as you are iterating over it 代码: def remove_dups(L1,L2): for e in L1: if e in ...
- Tyvj - 1305 单调队列优化dp
今天有点头痛就不写具体细节了,贴完走人 #include<iostream> #include<algorithm> #include<cstdio> #inclu ...
- os.path模块
什么是os.path模块 该模块用于处理路径,我们知道python是一门跨平台的语言,二每种操作系统,文件路径是截然不同的,为了使程序可以在不同平台生正确运行,python提供了该模块,使用该模块可以 ...
- mysql 数据库导入数据报错MySQL server has gone away解决办法
mysql 数据库导入数据报错MySQL server has gone away解决办法: 进入数据库执行以下命令即可: set global wait_timeout = 2880000; set ...
- Python入门笔记——(2)列表和元组
一.序列 python包含6种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.序列中每个元素被分配一个序号即索引,第一个索引为0,第二个为1,以此类推.也可以 ...
- mysql explain工具使用
explain工具可以确认执行计划是否良好,查询是否走了合理的索引.查询的执行计划,随着数据的变化也可能会有变化.调用方式:explain + [sql语句]. 另外,explain是有局限性的:1. ...