美文网首页
事件分发学习总结1

事件分发学习总结1

作者: 吃饱了就送 | 来源:发表于2020-01-07 15:05 被阅读0次

事件分发总结2

dispatchTouchEvent

return true:表示该View内部消化掉了所有事件
return false:表示事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费
return super.dispatchTouchEvent(ev):默认事件将分发给本层的事件拦截onInterceptTouchEvent方法进行处理(只有返回super.dispatchTouchEvent(ev)才会触发onInterceptTouchEvent)

onInterceptTouchEvent

return true:表示将事件进行拦截,并将拦截到的事件交由本层控件的onTouchEvent进行处理
return false:表示不对事件进行拦截,事件得以成功分发到子View
return super.onInterceptTouchEvent(ev):默认表示不拦截该事件,并将事件传递给下一层View的dispatchTouchEvent

onTouchEvent

return true:表示onTouchEvent处理完事件后消费了此次事件
return fasle:表示不响应事件,那么该事件将会不断向上层View的onTouchEvent方法传递,直到某个View的onTouchEvent方法返回true
return super.dispatchTouchEvent(ev):表示不响应事件,结果与return false一样

Activity-Window-View。从上到下依次传递,当然了如果你最低的那个view onTouchEvent返回false 那就说明他不想处理 那就再往上抛,都不处理的话

如果某一个子View处理了Down事件,那么随之而来的Move和Up事件也会交给它处理。但是交给它处理之前,父View还是可以拦截事件的,如果拦截了事件,那么子View就会收到一个Cancel事件,并且不会收到后续的Move和Up事件。

传递细节描述

  • 事件从 Activity.dispatchTouchEvent() 开始传递, 依次通过getWindow().superDispatchTouchEvent(event)、mDecor.superDispatchTouchEvent(event) 传递,即从Activity-> PhoneWindow ->DecorView, DecorView 是整个 ViewTree 的顶层 ViewGroup ;
  • 在整个 ViewGroup 中,事件从顶层开始,依次往子View传递;
    父 ViewGroup 可以通过 onInterceptTouchEvent() 对事件做拦截,阻止其往下传递;
    如果未被拦截,则子 View 可以通过 onTouchEvent() 消费(处理)事件;
  • 如果事件从上往下传递过程中一直没有被拦截,且最底层子 View 没有消费事件,事件会反向往上传递,这时父 ViewGroup 可以在 onTouchEvent() 中消费该事件,如果还是没有被消费的话,最后会到 Activity 的 onTouchEvent() 函数;
  • 底层View是具有事件的优先消费权的;
  • 如果View 没有对 ACTION_DOWN 进行消费,此次点击的后续事件不会传递过来;
  • 如果 View 消费了 ACTION_DOWN ,此次点击的后续事件会直接给这个 View,这里的后续事件指的是 ACTION_MOVE 和 ACTION_UP 事件;此时,其父 ViewGroup 的 onIntercept 函数仍会被调用,仍能进行拦截,但它自己的 onIntercept 不会被调用了;
  • 子 View 可以在 onTouchEvent 中调用 getParent().requestDisallowInterceptTouchEvent(true),这样父 ViewGroup 的 onIntercept 在后续的事件中就不会被调用了;
  • 如果第一个事件即 ACTION_DOWN 就被父 ViewGroup 拦截了,子 View 将不会获取到消费事件的机会;
  • OnTouchListener 优先于 onTouchEvent() 对事件进行消费;
    消费指的是相应的函数返回 true ;
  • ViewGroup 才有 onIntercept 方法,View 是没有的,即View不可以拦截事件;
  • 所有的事件处理过程都是以 ACTION_DOWN 开始,ACTION_UP 或者 ACTION_CANCEL 结束,ACTION_UP 是事件正常处理逻辑的结束标志,ACTION_CANCEL 是由父 ViewGroup 主动发出,当父 ViewGroup 拦截了除 ACTION_DOWN 之外的事件,会给正在消费 ACTION_DOWN 并等待后续事件的子 View 发送一个 ACTION_CANCEL 事件,通知子 View 结束自己的事件等待;
    例:很多小伙伴在第一次使用手势监听的时候,肯定会遇到GestureDetector无效的情况,那么究竟是为什么呢?
    当你实现GestureDetector.OnGestureListener接口时,最好重写onDown() 方法,并且使其的返回值为true,这是因为所有手势都以onDown() 消息开头。

当一个 ViewGroup 接收到一个事件的时候,首先会调用 dispatchTouchEvent() 方法进行事件分发,如果 onInterceptTouchEvent() 返回 true,则代表当前 View 会拦截事件,则直接回调 onTouchEvent() 方法进行事件处理。如果不拦截,则直接回调子 View 的 dispatchTouchEvent() 方法,如此反复,一直到最里面的子 View。

当一个点击事件产生后,它的传递过程遵循以下顺序:Activity => Window => View,即事件总是先传递给 Activity,Activity 再传递给 Window,最后 Window 再传递给顶层 DecorView,然后遵循上面的方式一直在最里层 View。

而处理事件则从最里层 View 不断回传给自己的外层 View,如果一直没有 View 进行处理,则直接会回传到 Activity 中。

相关文章

  • 事件分发学习总结1

    事件分发总结2 dispatchTouchEvent return true:表示该View内部消化掉了所有事件r...

  • 七、事件分发

    1.事件分发的总结 事件分发顺序:Activity(Window) -> ViewGroup -> View 事件...

  • View事件分发---正文

    简介事件分发起源事件分发---正片ViewGroup的事件分发第1部分:第2部分:第3部分View的事件分发总结滑...

  • Android事件分发机制

    参考:更简单的学习Android事件分发 1. 相关方法 事件分发: dispatchTouchEvent 返回t...

  • 事件分发学习总结2

    所有事件返回值都为:return super.TouchEvent(event) 底层View是具有事件的优先消费...

  • View绘制流程及事件分发

    事件分发相关 1、事件分发流程 ViewGroup的事件分发 View的事件分发 View和ViewGroup的O...

  • 事件分发总结

    文章链接 www.jianshu.com/p/38015afcdb58# 事件分发的简单说明 www.cnblog...

  • 事件分发总结

    ViewGroup: dispatchTouchEvent 分发 ViewGroup接收到事件之后,根据dispa...

  • 4.2View相关-事件分发机制详解

    事件分发机制 为什么会有事件分发机制 三个重要的事件分发的方法 事件分发流程 1.为什么会有事件分发机制 andr...

  • Activity事件分发

    1.View的事件分发2.ViewGroup的事件分发3.Activity的事件分发 在View的事件分发最后有个...

网友评论

      本文标题:事件分发学习总结1

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