Android事件分发流程

2017-03-12  本文已影响85人  地球是猿的

事件分发机制,就是介绍view的click、touch、滑动等操作的事件传递流程。是很重要的一个知识体系。对于在开发中遇到的滑动失效、冲突等情况,只有了解了事件的分发机制,才能充分解决问题。

一、先要知道的一些东西

  1. 事件在三大层进行传递:Activity、ViewGroup、View。
  2. Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象。
  3. 在MotionEvent对象中包含着一系列需要分发的事件:
    MotionEvent.ACTION_DOWN:按下View(所有事件的开始)
    MotionEvent.ACTION_MOVE:滑动View
    MotionEvent.ACTION_CANCEL:非人为原因结束本次事件
    MotionEvent.ACTION_UP:抬起View(与DOWN对应)
  4. 一次完整的MotionEvent事件,是从用户触摸屏幕到离开屏幕。整个过程的动作序列:ACTION_DOWN(1次) -> ACTION_MOVE(N次) -> ACTION_UP(1次)。
  5. 处理事件的三个方法:
  1. 三个方法不同返回值的意义:

二、事件分发的流程

  1. 如果中间不手动对事件进行处理和拦截,那么默认的流程是从父控件依次向子控件传递,然后再从子控件传回父控件:
    从Activity---->ViewGroup--->View 从上往下调用dispatchTouchEvent方法,一直到最下面的子控件(该控件下没有子控件了)的时候,再由View--->ViewGroup--->Activity从下往上调用onTouchEvent方法。
  2. 明白了上面的东西,再来看下面这个经典的流程图:


    Android事件分发流程

二、ACTION_DOWN、ACTION_MOVE和ACTION_UP,这三个事件的传递

上面说的都是ACTION_DOWN的传递流程,ACTION_MOVE和ACTION_UP的传递流程不太一样。

只有当在onTouchEvent中返回true,对事件进行了终止时,这三者的流程不一样。其余在dispatchTouchEvent 和 onInterceptTouchEvent 中返回true、false、super,在onTouchEvent中返回false、super时ACTION_DOWN、ACTION_MOVE和ACTION_UP这三者的流程是一致的。
下面来看几张图,这里直接用了《图解 Android 事件分发机制》中的图片。这里只列出了onTouchEvent,另外两个方法和down完全一样,就不贴图了。


1
2
3
4
5

参考:
图解 Android 事件分发机制
Android事件分发机制详解:史上最全面、最易懂

上一篇下一篇

猜你喜欢

热点阅读