美文网首页
Android事件分发

Android事件分发

作者: AnnaLeeYY | 来源:发表于2017-03-27 16:23 被阅读0次

    前几天面试,面试官问了我一个问题如图:

    图.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

    相关文章

      网友评论

          本文标题:Android事件分发

          本文链接:https://www.haomeiwen.com/subject/yxyrottx.html