Android学习笔记(一)–Android事件分发

Android学习笔记(一)–Android事件分发

1、基础知识

  • 基础的事件类型

MotionEvent.ACTION_DOWN:按下动作,所有事件的开始
MotionEvent.ACTION_MOVE:滑动
MotionEvent.ACTION_UP:抬起
MotionEvent.ACTION_CANCLE:取消,非人为原因结束

  • 正常来说,事件不会单独存在,每一次点击操作都由一系列的基础事件组成

开始 -> DOWN事件 -> MOVE(可以存在 n>=0个) ->UP/CANCLE -> 结束

  • 当View上出现了Down,View会对此进行分发处理

  • 事件的传递

事件可以在Activity、ViewGroup、View之间进行传递。正常来说传递顺序为:

Activity -> ViewGroup -> View

  • 事件在分发过程中由哪些方法协作完成
方法 作用 Activity ViewGroup View
dispatchTouchEvent 分发传递 Y Y Y
onTouchEvent 直接处理点击事件 Y Y Y
onInterceptTouchEvent 事件拦截 N Y N

Y:方法存在,N:不存在

2、事件方法的执行顺序

  • dispatchTouchEvent

    当点击事件传递到此View或者Activity时,负责分发传递事件。是否消费事件:
    (a)默认实现:根据当前对象不同,返回的方法不同
    Activity:super.dispatchTouchEvent(ev);调用父容器的dispatchTouchEvent方法;
    ViewGroup:super.dispatchTouchEvent(ev);父类的dispatchTouchEvent会去调用自身的onInterceptTouchEvent;
    View:super.dispatchTouchEvent,父类中会去调用onTouchEventfangf
    (b) true
    消费事件且不会再传递,且后续事件会传递到当前View
    (c)false
    不消费事件,事件停止传递,将事件回传给父类的onTouchEvent方法,当前View仍能接收事件

  • onIterceptTouchEvent

    (a) true
    拦截事件,且事件不会再向下传递。会执行自身的onTouchEvent方法,后续事件均由此View处理

    (b) false(默认)
    不拦截事件,事件后续传递

  • onTouchEvent
    (a) true
    自身处理事件,拦截事件传递,并处理后续事件
    (b) false(默认)
    不处理事件,事件继续向下传递。将事件交由父控件的onTouchEvent处理。当前View不继续接收后续事件

事件分发流程

Android学习笔记(一)–Android事件分发

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