Android事件分发
2017-03-27 本文已影响0人
AnnaLeeYY
前几天面试,面试官问了我一个问题如图:
图.png当时我就懵了,应为我从来没有看过这方面的东西,哎!面试吃了亏,下来就下功夫了,这不我为了不让下一个面试官感到尴尬我要测底理解透了它........
Activity---dispatchTouchEvent(默认)----分发下一级
LinearLayout---dispatchTouchEvent(默认)----分发下一级 and LinearLayout---onInterceptTouchEvent(默认)----下一级处理
button---dispatchTouchEvent(默认)---自己onTouchEvent(默认)---处理事件
事件分发 dispatchTouchEvent
dispatchTouchEvent 的事件分发逻辑如下:
- Activity.dispatchTouchEvent 返回 true |fasle 事件只在 Activity 的 dispatchTouchEvent 进行处理。
- View|ViewGroup.dispatchTouchEvent 返回true, 事件在当前 View|ViewGroup 的 dispatchTouchEvent 方法进行消费,同时事件会停止继续传递;
- View|ViewGroup.dispatchTouchEvent 返回false, 事件有传递给 上一层的(可能是ViewGroup或者Activity) onTouchEvent进行处理
- View.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件会传递给当前View的 onTouchEvent 进行处理;
- ViewGroup.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件会传递给当前ViewGroup的 onInterceptTouchEvent 进行处理;
事件拦截 onInterceptTouchEvent
onInterceptTouchEvent 的事件拦截逻辑如下:
- 如果 onInterceptTouchEvent 返回 true,则表示将事件会被拦截,事件最终在当前ViewGroup的 onTouchEvent 进行处理;
- 如果 onInterceptTouchEvent 返回 false,则表示将事件没被拦截,事件会被传递到子 View上,再由子 View 的 dispatchTouchEvent来开始这个事件的分发;
- 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认不会被拦截,处理方式同返回false一样。
事件响应 onTouchEvent
onTouchEvent 的事件响应逻辑如下:
- 如果 onTouchEvent返回了 true 则会接收并消费该事件。
- 如果 onTouchEvent返回了 false 那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,
如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
- 如果返回 super.onTouchEvent(ev);
Activity.super.onTouchEvent(ev); 默认 返回 false
ViewGroup.super.onTouchEvent(ev); 默认 返回 false
View.super.onTouchEvent(ev); 默认 返回 true
事件分发.png总结表格