@[toc]程序员
事件:MotionEvent(点击事件)web
事件列:从手指接触屏幕至手指离开屏幕的这个过程所产生的一系列事件,通常状况下,点击事件都是从DOWN事件开始,UP事件结束,中间经历若干个MOVE事件。spa
事件类型: 手指按下 -->产生DOWN事件 手指滑动 -->产生MOVE事件 手指抬起 -->产生UP事件3d
看了很多文章,po一张比较好理解的图:基于ACTION_DOWN事件走向。 来源Kelinorm
先对这图作一些基本说明:cdn
上图很明显地表示了系统默认的对于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()才会被调用。
详细可参考博客中的参考图片及相关说明。此处再也不赘述,只作总结。
事件分发是第一次接触的东西,源码和实例等等尚未进行研究。如有错误之处,还望各位不吝赐教。