浅谈事件分发

@[toc]程序员

何为事件分发

  • 基础知识

事件:MotionEvent(点击事件)web

事件列:从手指接触屏幕至手指离开屏幕的这个过程所产生的一系列事件,通常状况下,点击事件都是从DOWN事件开始,UP事件结束,中间经历若干个MOVE事件。spa

事件类型: 手指按下 -->产生DOWN事件 手指滑动 -->产生MOVE事件 手指抬起 -->产生UP事件3d

  • 定义理解:通常来讲,事件分发就是将点击事件分发(能够理解为传递)到一个view去处理该事件。

ACTION_DOWN事件怎么传递和处理的

看了很多文章,po一张比较好理解的图:基于ACTION_DOWN事件走向。 来源Kelinorm

先对这图作一些基本说明:cdn

  • true---该控件或activity消费事件,事件再也不被传递。
  • false---该控件或actiivty不消费事件,事件被继续传递。
  • super---调用该方法的父类实现,在方法中可修改返回值。
  • dispatchTouchEvent()---事件首先到达的方法。用于分发点击事件,通常不会重写这个方法。
  • onInterceptTouchEvent()---判断是否拦截该事件,用来拦截事件。
  • onTouchEvent()---判断是否消费该事件,用来处理事件。

在这里插入图片描述

上图很明显地表示了系统默认的对于down事件的传递方式。咱们能够观察到这些事件在三个对象间进行传递,分别是activity,viewgroup,view。 总结: activity层的dispatchTouchEvent()---调用--->activity层父类的dispatchTouchEvent()(默认实现是调用viewgroup层的dispatchTouchEvent())---调用--->super的默认实现 viewgroup层onInterceptTouchEvent()---调用--->【默认返回false】super的默认实现view层dispatchTouchEvent()---调用--->super的默认实现view层的onTouchEvent()对象

在这以后,如图,默认状况下,view层和Viewgroup都不进行消费,那么就会一路传给了activity层的onTouchEvent()进行消费。 因而出现了相似U型的流程走向。blog

po另一张图,来源仍是 Kelin 事件

在这里插入图片描述
注:右上角的横线代表返回值 咱们能够很清楚地看到整个的流程,有几点总结一下

1.只有viewgroup才有 onInterceptTouchEvent()方法。图片

2.当viewgroup层的 onInterceptTouchEvent()返回值为true,代表该viewgroup想要处理这个事件,那么这个事件便会传递给其onTouchEvent()进行处理。

3.若是onTouchEvent()或者dispatchTouchEvent()不想处理事件,返回false,则抛给上级的onTouchEvent()进行处理。

4.另外,调用优先级: onTouchListener的onTouch>View的onTouch>onClickListener 当一个view须要处理事件时,若是它设置了onTouchListener,那么onTouchEvent()中的onTouch()会被回调。若是该方法返回值为true,那么当前view的onTouchEvent()将不会被调用,返回false才会调用到view的onTouchEvent()。这个时候再onTouchEvent()中设置的onClickListener()才会被调用。

ACTION_MOVE和ACTION_UP事件怎么传递和处理的

详细可参考博客中的参考图片及相关说明。此处再也不赘述,只作总结。

  • 总结
    • 1.当一个view决定拦截一个事件后,系统会把同一个事件系列内的全部事件都交给他处理,此时不须要再调用拦截器询问是否须要拦截。所以同一个事件系列中的事件通常也只由一个view进行处理。
    • 2.在DOWN事件发生时,若是某个view的onTouchEvent()被调用,可是返回了false[即不想处理],那么该事件系列后续的事件也再也不传递给他,乃是传给其父类viewgroup的onTouchEvent()。这一点的话很像是上级交给程序员一个任务,他没完成,交给他的上级完成。那么短期内他的上级就不会交给他相关任务了。 这个时候咱们可能会发现,其实事件分发的机制能够用领导交给下级任务这种职场常见模式进行分析,或许这样会更加容易理解。
    • 3.在哪一个对象的onTouchEvent()进行消费,那么后续的事件都会给其进行处理。

事件分发是第一次接触的东西,源码和实例等等尚未进行研究。如有错误之处,还望各位不吝赐教。

相关文章
相关标签/搜索