Android中的事件分发机制

转载 2016年08月29日 16:47:12

Android中的事件分发机制

Android开发中在处理View的点击事件时,肯定少不了要知道事件的分发机制。事件分发机制用到的方法有三个:

  • dispatchTouchEvent(MotionEvent ev);
  • onInterceptTouchEvent(MotionEvent ev);
  • onTouchEvent(MotionEvent ev);

Touch事件相关方法

相关方法 用法 用法 用法
dispatchTouchEvent 事件分发 YES YES
onInterceptTouchEvent 事件拦截 YES NO
onTouchEvent 事件响应 YES YES

从这张表中我们可以看到 ViewGroup 及其子类对与 Touch 事件相关的三个方法均能响应,而 Activity 对 onInterceptTouchEvent(MotionEvent ev) 也就是事件拦截不进行响应。另外需要注意的是 View 对 dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev) 的响应的前提是可以向该 View 中添加子 View,如果当前的 View 已经是一个最小的单元 View(比如 TextView), 那么就无法向这个最小 View 中添加子 View,也就无法向子 View 进行事件的分发和拦截,所以它没有dispatchTouchEvent(MotionEvent ev)和onInterceptTouchEvent(MotionEvent ev)只有onTouchEvent(MotionEvent ev)。

Touch 事件分析

事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑如下:

  • 如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
  • 如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
  • 如果 return false,事件分发分为两种情况:
    • 1.如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
    • 2.如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。

事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)

在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑如下:

  • 如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
  • 如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
  • 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。

事件响应:public boolean onTouchEvent(MotionEvent ev)

在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑如下:

  • 如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
  • 如果返回了 true 则会接收并消费该事件。
  • 如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。

android之View和ViewGroup事件分发机制分析(一)(View的事件分发机制)

要把安卓学好,自定义View,事件分发机制,自定义动画之类的是必须掌握的,如果不想弄得那么高级来自定义,也可以不学。当初自己也是看了很多相关的书籍和博客文章,理了很久的思路。现在事件分发机制的分析已经...
  • gsw333
  • gsw333
  • 2016年07月25日 19:10
  • 632

Android事件分发机制 详解攻略,您值得拥有

前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化等等 今天,我...
  • carson_ho
  • carson_ho
  • 2017年01月06日 11:43
  • 38634

Android ViewGroup事件分发机制

上一篇已经完整的解析了Android View的事件分发机制,今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对V...
  • lmj623565791
  • lmj623565791
  • 2014年09月09日 09:38
  • 78184

android事件分发机制解析(配流程图)

事件分发机制 一.点击事件传播路径 1.点击事件TouchEvent最先是到达Activity的,然后传给Activity对应的window,再传给DecorView,再传给id为content的...
  • sggdjfkf147896325
  • sggdjfkf147896325
  • 2016年07月20日 11:29
  • 522

一步步理解Android事件分发机制

回想一下,通常在Android开发中,我们最常接触到的是什么东西?显然除了Activity以外,就是各种形形色色的控件(即View)了。 与此同时,一个App诞生的起因,终究是根据不同需求完成与用户...
  • ghost_Programmer
  • ghost_Programmer
  • 2016年07月21日 18:57
  • 2719

Android开发中的事件分发机制梳理

本文为事件分发的学习总结。 《Android开发艺术探索》一书中对事件分发做了很详细的介绍。 大神博客:http://blog.csdn.net/singwhatiwannaView的事件分发机制...
  • android_zyf
  • android_zyf
  • 2017年03月05日 12:55
  • 774

Android事件分发机制练习---打造属于自己的瀑布流

坚持一件对自己有益的事!!!
  • dmk877
  • dmk877
  • 2015年10月16日 10:04
  • 1418

【Android面试笔记】(一)事件分发机制

首先我们必须了解三个方法 1.dispatchTouchEvent 2interceptTouchEvent      3.TouchEvent 下面先介绍第一个:dispatchTouchEvent...
  • u011669081
  • u011669081
  • 2015年10月18日 18:19
  • 1616

完全理解android事件分发机制

前言之前笔者其实已经写过事件分发机制的文章:快速理解android事件传递拦截机制概念 但是,现在看来其实更像是一篇知识概括,多处可能未讲清楚,于是打算重写事件分发,用一篇文章大致讲清楚。 首先,...
  • Double2hao
  • Double2hao
  • 2017年01月12日 10:04
  • 799

Android开发-事件分发机制实验分析ViewGroup、View事件分发,结合职责链模式

介绍上一篇博客职责链/责任链模式(Chain of Responsibility)分析理解和在Android的应用 介绍了职责链模式,作为理解View事件分发机制的基础。 套用职责链模式的结构分析...
  • Card361401376
  • Card361401376
  • 2016年06月01日 18:01
  • 4635
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中的事件分发机制
举报原因:
原因补充:

(最多只允许输入30个字)