总结一下:

  1. 事件序列的定义:从手触摸屏幕(含)到离开屏幕(含)期间所发生的一系列交互事件。
    主要由ACTION_DOWN、ACTION_MOVE、ACTOIN_UP、ACTION_CANCEL等组成,其中一次事件序列中,DOWN和UP都只有最多一个,MOVE有若干个,可以为0个。
    定律:某个View只有将ACTION_DOWN处理(消费)掉,才会有机会处理后面的ACTION_MOVE和ACTION_UP。
  2. 定律:正常情况下,一个事件序列只能被一个View 拦截且消耗。 因为一旦一个元素拦截了某事件,那么同一个事件序列内的所有事件都会直接交给它处理,因此同一个事件序列中的事件不能分别由两个View同时处理。 但是通过特殊手段可以做到,比如一个View将本该自己处理的事件通过 onTouchEvent 强行传递给其他 View 处理。
  3. 事件分发中只有两个主角:ViewGroup和View。
    ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个有关方法,View仅包含dispatchTouchEvent、onTouchEvent两个有关方法。其中ViewGroup又继承于View。
    ViewGroup 默认不拦截任何事件。Android 源 码中 ViewGroup 的 onInterceptTouchEvent 方法默认返回 false。
  4. 事件传递的两种方式:
    隧道方式:从根元素依次往下传递直到最内层子元素;
    冒泡方式:从最内层子元素依次往外传递直到根元素。
    dispatchTouchEvent是隧道方式,onTouchEvent是冒泡方式(若返回true,则上层不再处理)。
  5. parent.requestDisallowInterceptTouchEvent(boolean)的作用:在子View中有机会告诉父View是否要拦截事件。
    注意:无法通过调用该方法让父View拦截ACTION_DOWN事件。

参考:

《Android开发艺术探索》
《Android - 事件模型》https://www.cnblogs.com/bill-joy/archive/2012/03/20/2407928.html

【Android开发坑系列】之事件分发机制的更多相关文章

  1. Android为TV端助力 事件分发机制

    android事件分发机制,给控件设置ontouch监听事件,当ontouch返回true时,他就不会走onTouchEvent方法,要想走onTouchEvent方法只需要返回ontouch返回fa ...

  2. Android面试收集录6 事件分发机制

    转自:秋招面试宝典. 一. 基础认知 1.1 事件分发的对象是谁? 答:事件 当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件). Touch事件相关细节(发 ...

  3. 【Android开发坑系列】之事件

    总结一下: 1.Touch事件分发中只有两个主角:ViewGroup和View.ViewGroup包含onInterceptTouchEvent.dispatchTouchEvent.onTouchE ...

  4. Android 开发 框架系列 EventBus 事件总线

    介绍 GitHub:https://github.com/greenrobot/EventBus 先聊聊EventBus 线程总线是干什么的,使用环境,优点.缺点. 干什么的? 一句话,简单统一数据传 ...

  5. 【Android开发坑系列】如何让Service尽可能存活

    流行的思路如下[2015-11-20更新]: 1.让Service杀不死.Service的onStartCommand返回START_STICKY,同时onDestroy里面调用startServic ...

  6. 【Android开发坑系列】之Fragment

    这个东西有顾名思义是碎片,和之前的Activity对应. 坑1:一般情况都会想当然的以为进程被杀掉之后,Fragment也会被回收 其实,Fragment有自己的生命周期,有自己的管理器(Fragme ...

  7. 【Android开发坑系列】之PopupWindow

    PopupWindow在4.0之前的版本有个系统级别的BUG,必须借助一段自定义的fix代码来修复.其中mPopPm就是PopupWindow实例.java.lang.NullPointerExcep ...

  8. 【Android开发坑系列】之经常被忽略的背景图片内存泄露

    我们平时设置图片的时候,几乎都忘记回收老的(背景)图片,比如: TextView.setBackgroundDrawable() TextView.setBackgroundResource() Im ...

  9. 【Android开发坑系列】之try-catch

    try { mViewPager.postDelayed(new Runnable() { @Override public void run() { getCurrentPage().render( ...

随机推荐

  1. CodeForces - 893C Rumor【并查集】

    <题目链接> 题目大意: 有n个人,其中有m对朋友,现在你有一个秘密你想告诉所有人,第i个人愿意出价a[i]买你的秘密,获得秘密的人会免费告诉它的所有朋友(他朋友的朋友也会免费知道),现在 ...

  2. 数据结构--图 的JAVA实现(上)

    1,摘要: 本系列文章主要学习如何使用JAVA语言以邻接表的方式实现了数据结构---图(Graph),这是第一篇文章,学习如何用JAVA来表示图的顶点.从数据的表示方法来说,有二种表示图的方式:一种是 ...

  3. Spring BPP中优雅的创建动态代理Bean

    一.前言 本文章所讲并没有基于Aspectj,而是直接通过Cglib以及ProxyFactoryBean去创建代理Bean.通过下面的例子,可以看出Cglib方式创建的代理Bean和ProxyFact ...

  4. SpringMVC(二五) JSTL View

    项目中使用JSTL,SpringMVC会把视图由InternalView转换为JstlView. 若使用Jstl的fmt标签,需要在SpringMVC的配置文件中配置国际化资源文件. 实现过程: 1. ...

  5. PHP 对POST数据的处理

    // 获取body中json数据并初始化为数组$data = json_decode(file_get_contents('php://input'), true);

  6. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件

    XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的“前往”|“前 ...

  7. 60.Search Insert Position.md

    描述 给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引.如果没有,返回到它将会被按顺序插入的位置. 你可以假设在数组中无重复元素. 您在真实的面试中是否遇到过这个题? 样例 Given ...

  8. RESTful restful api Representational State Transfer

    通俗直白讲:REST是一种编写风格,一种API接口规范.它的风格就是将对象(如学生)的状态(如增删改查,API接口版本号等等)通过其他方式传递,API的接口地址突显出描述的对象. -- == REST ...

  9. 一道有意思的找规律题目 --- CodeForces - 964A

    题目连接: https://vjudge.net/problem/1502082/origin 这一题第一眼看过去貌似是模拟,但是根据其范围是1e9可以知道,如果暴力解基本上是不可能的(不排除大佬级优 ...

  10. Codeforces.1051G.Distinctification(线段树合并 并查集)

    题目链接 \(Description\) 给定\(n\)个数对\(A_i,B_i\).你可以进行任意次以下两种操作: 选择一个位置\(i\),令\(A_i=A_i+1\),花费\(B_i\).必须存在 ...