Android事件传递机制

android的事件传递也许困扰着不少的开发者,今天我来写篇文章,希望能帮助到不懂的朋友。

几个重要的知识点:

1,dispatchTouchEvent和onTouchEvent具备事件消费能力,onInterceptTouchEvent不具备事件消费能力;

2,事件一旦被消费,则不会在继续传递;

3,ACTION_DOWN、ACTION_MOVE、ACTION_UP是一组事件,但不是同一个事件,换句话说即使ACTION_DOWN被消费,ACTION_MOVE和ACTION_UP还是会走事件传递的逻辑,当ACTION_DOWN事件最终被activity.onTouchEvent消费时,activity就理解为没有view或者ViewGroup想要消费本组事件,则ACTION_MOVE、ACTION_UP等同一组等事件不会再走事件传递流程。

4,事件传递顺序,activity.dispatchTouchEvent --> ViewGroup.dispatchTouchEvent --> ViewGroup.onInterceptTouchEvent --> View.dispatchTouchEvent --> View.onTouchEvent --> ViewGroup.onTouchEvent --> activity.onTouchEvent。向下传递会传递给下层的dispatchTouchEvent,向上传递会传递给上层的onTouchEvent,同层传递一般是dispatchTouchEvent --> onInterceptTouchEvent --> onTouchEvent ,没有onInterceptTouchEvent则直接传递给onTouchEvent(比如activity和view就没有onInterceptTouchEvent)。

理解事件传递机制首先要了解几个关键的方法。

1,Activity 的 dispatchTouchEvent 和 onTouchEvent 方法。

activity 的 dispatchTouchEvent 是触摸事件的起源,此方法不管 return true 还是 return false 都表示消费事件,该事件不再传递。如果需要屏蔽当前Activity的所有触摸包括点击事件,则可以在这个方法上做文章。

activity 的 onTouchEvent 是触摸事件的最末端,只有当activity所有的子view都不消费事件的时候,这个方法才会被回调。

2,ViewGroup 的 dispatchTouchEvent、onInterceptTouchEvent 和 onTouchEvent 方法

dispatchTouchEvent

return super.dispatchTouchEvent 分发、不消费、继续传递事件

return true 不分发、消费、不再传递事件

return false 不分发、不消费、事件退回给上层View的onTouchEvent,如果没有上层View,则返回给activity的onTouchEvent

onInterceptTouchEvent

return super.onInterceptTouchEvent 不拦截、继续传递事件

return false 不拦截、继续传递事件。同super.onInterceptTouchEvent

return true 拦截事件、交给this.onTouchEvent处理,如果this.onTouchEvent不处理,则向上传递

onTouchEvent

return super.onTouchEvent 不消费、向上传递

return false 不消费、向上传递,同super.onTouchEvent

return true 消费事件、不再传递事件

3,View 的 dispatchTouchEvent 和 onTouchEvent 方法

View.dispatchTouchEvent同ViewGroup.dispatchTouchEvent

View.onTouchEvent同ViewGroup.onTouchEvent


The end.

你可能感兴趣的:(Android事件传递机制)