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的更多相关文章

  1. 事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序

    一直想弄清楚onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent的执行顺序,以及内部使用switch (event.getAction())中的执 ...

  2. 关于dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的分发机制浅析

    虽说这个问题不是很难...动动手就能看出答案...但是似乎不太容易理解...几次尝试把这个问题说明白....但是好像感觉说不明白....(顿时想起了那句话----说不明白就是自己还不明白! 我怎么可能 ...

  3. Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

    Android事件分发机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 Android事件分发机制的发生在Vi ...

  4. Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习

    package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...

  5. ontouch、dispatchtouchevent、interceptouchevent-相关事件

    这几天一直在研究onTouch的相关方法,今天我们就来看看onTouchEvent.dispatchTouchEvent.onIntercepTouchEvent这三个方法在控件之间的传递顺序 pub ...

  6. 札记:android手势识别,MotionEvent

    摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势T ...

  7. android 事件分发机制详解(OnTouchListener,OnClick)

    昨天做东西做到触摸事件冲突,以前也经常碰到事件冲突,想到要研究一下Android的事件冲突机制,于是从昨天开始到今天整整一天时间都要了解这方面的知识,这才懂了安卓的触摸和点击事件的机制.探究如下: 首 ...

  8. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...

  9. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

随机推荐

  1. String Reduction问题分析

    问题描述: Given a string consisting of a,b and c's, we can perform the following operation: Take any two ...

  2. 使用Git向GitHub上上传代码

    参考:http://www.cnblogs.com/yxhblogs/p/6130995.html 如果遇到[git无法pull仓库refusing to merge unrelated histor ...

  3. 【算法笔记】B1004 成绩排名

    1004 成绩排名 (20 分) 读入 n(>0)名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 ...

  4. ASP.NET 设计模式分为三种类型

    设计模式分为三种类型,共23类.  一.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.      二.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代 ...

  5. Trailing Loves (or L'oeufs?)

    The number "zero" is called "love" (or "l'oeuf" to be precise, literal ...

  6. MITx: 6.00.1x Introduction to Computer Science and Programming Using Python Week 2: Simple Programs 4. Functions

    ESTIMATED TIME TO COMPLETE: 18 minutes We can use the idea of bisection search to determine if a cha ...

  7. [转] node.js如何获取时间戳与时间差

    [From] http://www.jb51.net/article/89767.htm Nodejs中获取时间戳的方法有很多种,例如: 1.new Date().getTime()  2.Date. ...

  8. centos yum安装高版本php,apache,mysql

    1.检查当前安装的PHP包 yum list installed | grep php 或者   yum list installed php* 如果要删除,可执行 yum remove php.x8 ...

  9. vue工程中使用iconfont在线CDN不生效的问题

    为什么在vue工程中引入iconfont有时候不生效呢? 请依次使用以下方法 1. 在index.html中引入在线资源 <!DOCTYPE html> <html lang=&qu ...

  10. 引导篇之web结构组件

    web结构组件有如下几种: 代理 HTTP代理服务器,是Web安全.应用集成以及性能优化的重要组成模块.代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求 ...