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事件分发机制演示demo

  • 2015年11月10日 19:42
  • 5.83MB
  • 下载

Android事件分发机制总结Demo

  • 2016年01月21日 13:44
  • 6.36MB
  • 下载

Android View 事件分发机制 源码解析(ViewGroup篇)

本期三篇文章目录(可点击跳转)一. Android TouchEvent事件传递机制初识 二. android点击事件传递源码讲解(ViewGroup) 三.android点击事件传递源码讲解(...

Android事件分发机制小Demo

  • 2016年03月02日 13:32
  • 1.95MB
  • 下载

Android事件分发机制

  • 2015年08月18日 11:58
  • 5.16MB
  • 下载

Android事件的分发机制

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分发机...

Android事件分发机制与滑动冲突

  • 2016年08月12日 20:03
  • 20.56MB
  • 下载

【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

文章转自:http://blog.csdn.net/guolin_blog/article/details/9097463其实我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客开始...

android中触摸事件的分发机制

  • 2015年08月25日 11:34
  • 3.66MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中的事件分发机制
举报原因:
原因补充:

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