浅析 Android 事件传递

1,146 阅读1分钟
原文链接: blog.csdn.net

Android中View的事件传递主要涉及三个方法:dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()。

下面详细分析一下,当三个方法返回不同的值的时候,事件是如何从最上层Activity往下层子View传递的。

1.Activity.dispatchTouchEvent 返回 true |fasle 事件只在 Activity 的 dispatchTouchEvent 进行处理

2.View|ViewGroup.dispatchTouchEvent 返回true, 事件在当前 View|ViewGroup 的 dispatchTouchEvent 方法进行消费,同时事件会停止继续传递;

3.View|ViewGroup.dispatchTouchEvent 返回false, 事件有传递给 上一层的(可能是ViewGroup或者Activity) onTouchEvent进行处理

4.View.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件会传递给当前View的 onTouchEvent 进行处理;

5.ViewGroup.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件会传递给当前ViewGroup的 onInterceptTouchEvent 进行处理;

6.如果 onInterceptTouchEvent 返回 true,则表示将事件会被拦截,事件最终在当前ViewGroup的 onTouchEvent 进行处理;

7.如果 onInterceptTouchEvent 返回 false,则表示将事件没被拦截,事件会被传递到子 View上,再由子 View 的 dispatchTouchEvent来开始这个事件的分发;

8.如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认不会被拦截,处理方式同返回false一样。

9.如果 onTouchEvent返回了 true 则会接收并消费该事件。

10.如果 onTouchEvent返回了 false 那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。

11.如果返回 super.onTouchEvent(ev);相当于:
Activity.super.onTouchEvent(ev); 默认 返回 false
ViewGroup.super.onTouchEvent(ev); 默认 返回 false
View.super.onTouchEvent(ev); 默认 返回 true