所谓的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。

点击事件的分发由3个方法共同完成:
 public boolean dispatchTouchEvent(MotionEvent event)
用来进行事件分发,如果事件能传递给当前View,那么此方法一定会被调用,返回结果受View的onTouchEvent 和下级的dispatchTouchEvent方法影响,表示是否消耗当前事件。
    
 public boolean onInterceptTouchEvent(MotionEvent ev)
在上述方法内部调用,用来判断是否拦截是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会再次调用,返回结果表示是否拦截当前事件

 public boolean onTouchEvent(MotionEvent event)
在dispatchTouchEvent 方法中调用,用来处理点击事件,返回结果是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接受到事件。

对于一个根ViewGroup来说:

产生事件后
首先传递它,这时dispatchTouchEvent 会调用ViewGroup的onInterceptTouchEvent
-----ViewGroup的onInterceptTouchEvent返回true就表示拦截当前事件,接着事件会交给ViewGroup处理,即onTouchEvent会被调用
-----ViewGroup的onInterceptTouchEvent返回false表示不拦截事件,这个事件会传递给子元素,接着子元素的dispatchTouchEvent会被调用

事件传递:activity > Window > view

事件传递结论:
1.同一个事件序列是从手指接触屏幕那一刻开始,到手指离开屏幕那一刻结束。
2.正常情况下,一个事件序列只能被一个View拦截且消耗
3.某个View一旦决定拦截,那么这个事件序列只能它来处理,它的onInterceptTouchEvent不会再被调用               

4.某个View一旦开始,如果它不消耗ACTION_DOWN 事件即onTouchEvent返回来false,那么同一事件序列中的其它事件都不会再交给它来处理。
5.如果不消耗ACTION_DOWN以外的事件,那么这个点击事件会消失,此时父元素的onTouchEvent并不会被调用,并且当前View回持续收到后续事件,最后这些消失的事件会传递个给Activity处理
6.ViewGroup默认不拦截事件onInterceptTouchEvent默认返回fakse
7.View 没有onInterceptTouchEvent,一旦事件传递给View,onTouchEvent就会被调用
8.View的onTouchEvent默认消耗事件,返回true,除非它不可点击 clickable和longClickable同时为false;View的longClickable默认未false,clickable要分情况;
9.View的enable属性不影响onTouchEvent的默认值返回。
10.onClick 会发生的前提是当前View是可点的,并收到down 和up 事件
11.事件传递过程是由外向内的,事件总是先传递给父元素再由父元素分发给子元素。

View事件分发机制的更多相关文章

  1. Atitit View事件分发机制

    1. Atitit View事件分发机制 1. Atitit View事件分发机制1 1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTo ...

  2. Android面试必问!View 事件分发机制,看这一篇就够了!

    在 Android 开发当中,View 的事件分发机制是一块很重要的知识.不仅在开发当中经常需要用到,面试的时候也经常被问到. 如果你在面试的时候,能把这块讲清楚,对于校招生或者实习生来说,算是一块不 ...

  3. Android View 事件分发机制 源码解析 (上)

    一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...

  4. Android View 事件分发机制详解

    想必很多android开发者都遇到过手势冲突的情况,我们一般都是通过内部拦截和外部拦截法解决此类问题.要想搞明白原理就必须了解View的分发机制.在此之前我们先来了解一下以下三个非常重要的方法: di ...

  5. Android View框架总结(七)View事件分发机制

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52282833 View布局告一段落,从本篇开始View事件相关分析, ...

  6. android view事件分发机制

    首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志 ...

  7. 浅谈Android View事件分发机制

    引言 前面的文章介绍了View的基础知识和View的滑动,今天我们来介绍View的另一个核心知识,View的事件分发机制. 点击事件的传递规则 所谓的点击事件的分发机制,其实就是对MotionEven ...

  8. Android View 事件分发机制 源代码解析 (上)

    一直想写事件分发机制的文章,无论咋样,也得自己研究下事件分发的源代码.写出心得~ 首先我们先写个简单的样例来測试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个M ...

  9. 自定义控件(视图)2期笔记10:自定义视图之View事件分发机制("瀑布流"的案例)

    1. Touch事件的传递:   图解Touch事件的传递,如下: 当我们点击子View 02内部的Button控件时候,我们就触发了Touch事件. • 这个Touch事件首先传递给了顶级父View ...

  10. android View事件分发机制结论

    原始博客有对源码的分析:http://blog.csdn.net/lmj623565791/article/details/39102591 结论:1.view事件的分发流程: dispatchTou ...

随机推荐

  1. 系统调用与API的区别

    整理自系统调用与API的区别 1.为什么用户程序不能直接访问系统内核模式提供的服务? 答:在linux中,将程序的运行空间分为内核与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程 ...

  2. 17.1.2 Replication Formats

    17.1.2 Replication Formats 复制格式 17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Bas ...

  3. oracle构建一致性读

    对于实际的业务系统,通常有一些热点的表,insert和delete的量非常大,这个时候就会发现一些查询语句的逻辑读比较偏高,这时可能就是oracle在构建一致性块的进行的consistent read ...

  4. 基于mongoDB的capped collection的性能优化

    MonitorLogging改造(消息接入) 改造前架构: 可以看出原来的流程中,大量业务分析,业务接入耦合在web服务层.大量操作,导致线程线性的挂起线程. 改造后: 将业务通讯抽象成为Monito ...

  5. [Java]重载,重写以及继承,多态的区别

    转自:http://android.blog.51cto.com/268543/53181 什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承. ...

  6. slua 中使用 lua5.3

    因为我们服务器极有可能要迁移到 skynet 上,它基于 lua5.3,而服务器和客户端会公用很多lua代码,所以在考虑在客户端 slua 中使用 lua5.3. 经过编译后,发现 slua 对 lu ...

  7. JavaScript浏览器本地数据存储

    浏览器本地存储主要使用的是sessionStorage和localStorage.两者都支持,sessionStorage保存的是浏览器和服务器的一次对话信息,只在一次回话中有效.当在新标签页或新窗口 ...

  8. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

  9. OpenCL 第10课:kernel,work_item和workgroup

    转载自:http://www.cmnsoft.com/wordpress/?p=1429 前几节我们一起学习了几个用OPENCL完成任务的简单例子,从这节起我们将更详细的对OPENCL进行一些“理论” ...

  10. [LeetCode] 287. Find the Duplicate Number 解题思路

    Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro ...