浅谈Android事件分发

2019-07-31  本文已影响0人  8e750c8f0fae

@[toc]

何为事件分发

事件:MotionEvent(点击事件)

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

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

ACTION_DOWN事件怎么传递和处理的

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

先对这图做一些基本说明:

在这里插入图片描述

上图很明显地表示了系统默认的对于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型的流程走向。

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事件怎么传递和处理的

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

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

作者介绍

-杨晓华:广州芦苇科技 APP 团队 Android 开发

内推信息

上一篇 下一篇

猜你喜欢

热点阅读