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不继续接收后续事件
事件分发流程
参考Blog:Android事件分发机制详解:史上最全面、最易懂