Android Touch事件分发机制

Android Touch事件分发机制

在Android开发过程中大家总是会遇到各种各样的事件冲突,当我们试图去解决的时候,势必要先对事件的分发有一定的了解,下面就讲一下Android的事件分发机制。
Android 中与事件分发相关的方法包括:

- dispatchTouchEvent(MotionEvent ev)
- onInterceptTouchEvent(MotionEvent ev)
- onTouchEvent(MotionEventev);

能够响应这些方法的控件包括:ViewGroup 及其子类、Activity。其中Activity没有onInterceptTouchEvent方法;
另外需要注意的是 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方法进行分发,dispatchTouchEvent(MotionEvent ev) 的分发逻辑如下:
    • return true,事件由当前view的dispatchTouchEvent进行消费,并终止事件的向下传递。
    • return false,将事件返回给父View(当view为最外层view是给activity)的onTouchEvent 进行消费。
    • return super.dispatchTouchEvent(ev),这是dispatchTouchEvent 默认的返回值,当返回这个值时将调用当前View的 onInterceptTouchEvent(MotionEvent ev)方法。
  • 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev) :
    在当前view的dispatchTouchEvent返回super.dispatchTouchEvent(ev)时,会调用onInterceptTouchEvent方法,这个方法的返回值决定了是否对事件进行拦截。
    • return true,对事件进行拦截,交由当前View的OnTouchEvent 进行处理
    • return false,对事件进行放行,将事件交由子View的dispatchTouchEvent进行处理,子View再次对事件进行分发。
    • 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 时相同。

Note:解决事件的冲突主要就是通过重写这几个方法来进行,在遇到是结合实际情况进行处理即可。
参考文章,在书写过程中有参考这篇博客,大家也可以移步查看。。。

你可能感兴趣的:(android)