事件拦截机制简单分析

1 ViewGroup来说,有三个重要的事件拦截和处理的方法: dispatchTouchEvent (MotionEvent e) , onInterceptTouchEvent(MotionEvent e), onTouchEvent(MotionEvent e)
2 对于View来说,有两个重要的事件拦截和处理方法: dispatchTouchEvent(MotionEvent e), onTouchEvent(MotionEvent e)
注: 从上述方法可知,有分发事件,拦截事件,处理事件

举例1
嵌套结构是: 最外层是ViewGroupA,中间层是ViewGroupB,最底层是MyView, 并重写上述方法,不做任何处理时,执行过程如下,

事件拦截机制简单分析_第1张图片

分析: **事件的传递顺序是: ViewGroupA–>ViewGroupB–>MyView
事件的处理顺序是: MyView–>ViewGroupB–>ViewGroupA**
log输出的记录为: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
ViewGroupB onTouchEvent
ViewGroupA onTouchEvent

举例2
嵌套结构是: 最外层是ViewGroupA,中间层是ViewGroupB,最底层是MyView, 并重写上述方法,其中ViewGroupA中的onInterceptTouchEvent 事件返回true 将事件拦截下来,执行过程如下,

事件拦截机制简单分析_第2张图片

log输出的记录为: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupA onTouchEvent

举例3
嵌套结构是: 最外层是ViewGroupA,中间层是ViewGroupB,最底层是MyView, 并重写上述方法,其中ViewGroupB中的onInterceptTouchEvent 事件返回true 将事件拦截下来,执行过程如下,
事件拦截机制简单分析_第3张图片

log输出的记录为: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
ViewGroupB onTouchEvent
ViewGroupA onTouchEvent
举例4
嵌套结构是: 最外层是ViewGroupA,中间层是ViewGroupB,最底层是MyView, 并重写上述方法,其中MyView中的onTouchEvent 事件返回true 将事件拦截下来,执行过程如下,

事件拦截机制简单分析_第4张图片

log输出的记录为: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
举例5
嵌套结构是: 最外层是ViewGroupA,中间层是ViewGroupB,最底层是MyView, 并重写上述方法,其中ViewGroupB中的dispatchTouchEvent 事件返回true 将事件拦截下来,执行过程如下,
事件拦截机制简单分析_第5张图片

log输出的记录为: ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
ViewGroupB onTouchEvent

另: MotionEvent 是android为触摸事件封装的一个类, 触摸事件就是一个动作的类型加坐标就可以完成,
其中可以通过MotionEvent 中的event.getX()与event.getRawX获取坐标点; 通过不同的ACTION(比如 MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE)来区分不用的动作类型.

你可能感兴趣的:(事件拦截机制简单分析)