android 对于事件的分发,拦截,捕获再次思考总结

我们知道android事件处理机制通常这样处理,先从activity 窗口的decorview -->viewGroup .....->view,一般会用到下面几个方法:

1、在ViewGroup中,事件分为dispatchTouchEvent(事件的分发),onInterceptTouchEvent(事件的拦截),onTouchEvent(事件的处理)。

2、在View中,事件分为dispatchTouchEvent(事件的分发),onTouchEvent(事件的处理)。

3、在Activity中,事件分为dispatchTouchEvent(事件的分发),onTouchEvent(事件的处理)。

事件流转通过下图更清楚的表达出来:

android 对于事件的分发,拦截,捕获再次思考总结

 

图解:其中GroupA,GroupB为派生viewgroup子类 ,MyView 为View子类 ,其中GroupB onInterceptTouchEvent 返回true进行拦截消息,

GroupB onTouchEvent 消费事件 后返回true,ACTION_DOW,ACTION_MOVE,ACTION_UP事件流向如下:

1.ACTION_DOW: 从activity消息分发向下到GroupB 被拦截后不再向Myview传递事件 ,GroupB onTouchEvent 方法消费事件后结束.

2.ACTION_MOVE,ACTION_UP: 向下分发事件到GoupB,不再通过该控件的onIterceptTouchEvent 而是直接传递到该控件的onTouchEvent方法处理,事件也不再向上提交.

 

备注:方法requestDisallowInterceptTouchEvent可以用于控制控件的拦截设置.附图:

android 对于事件的分发,拦截,捕获再次思考总结