android开发之事件分发机制实例讲解
1.定义?
2.motionevent的具体动作?
3.事件分发的本质?
将点击事件传递到具体的view处理的整个过程
事件传递的过程=分发过程
4.事件在哪对象之间进行传递?
5.具体分发事项?
public booleandispatchtouchevent(motionevent ev)
用来进行事件的分发。如果当前事件能够传递给当前view,那么此方法一定会被调用,返回结果受当前view的ontochevent和下级view的dispatchtouchevent方法的影响,表示是否消耗当前事件。
public booleanonintercepttouchevent(motionevent ev)
在上述方法内部调用,用来判断是否拦截某个事件,如果当前view拦截了某个事件,
那么在同一个事件序列当中,此方法不会再次调用,返回结果表示是否拦截当前事件。
public booleanontouchevent(motionevent ev)
在dispatchtouchevent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前view无法再次接受到事件。
对于一个根viewgroup来说,点击事件产生后,首先会传递给它,这时它的dispatchtouchevent就会被调用,如果这个viewgroup的onintercepttouchevent方法返回true就表示它要拦截当前事件,接着事件就会交给这个viewgroup处理,即它的ontouchevent方法就会被调用;如果这个viewgroup的onintercepttouchevent返回false就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchtouchevent方法就会被调用,如此反复直到事件被最终处理。
但我们需要考虑一种情况,如果一个view的ontouchevent返回false,那么它的父容器的ontouchevent将会被调用。eg.上级分给了一个程序员去处理(这是事件分发的过程),结果这个程序员搞不定,就会交给上一级进行处理。上级处理不了,会交给上上级,这样一层一层往上抛。
默认:往下分发
true:拦截处理
false:往上抛(执行上级的ontouchevent)
注:只有viewgroup才有拦截方法
viewgroup(相对布局,线性布局,帧布局)
activity return false时执行ontouchevent
return true时不执行ontouchevent
如果view需要处理事件时,如果它设置了ontouchlistener,那么ontouchlistener中的ontouch方法会被调用。这时事件如何要看ontouch的返回值,如果返回false则调用当前view的ontouchevent方法会被 调用,如果返回true则不会调用ontouchevent。view的ontouchlistener其优先级比ontouchevent要高。在ontouchevent中设置onclicklistener,那么它的onclick方法会被调用。ontouchlistener的优先级最低,即处于事件传递的尾端。
activity存储在decorview中,decorview继承于framelayout,最终为viewgroup
*view叫根view,一般来说都是viewgroup
推荐阅读
-
android开发之事件分发机制实例讲解
-
Android开发之OpenGL、OpenGL ES的概念和实例讲解
-
Android开发之Parcel机制实例分析
-
Android开发之button事件监听简单实例
-
Android系统开发之Android平台调试实例讲解
-
Android开发之LinearLayout布局、RelativeLayout布局实例讲解
-
Android必备知识点之View及View的事件分发机制
-
Android——简单易懂说原理之View的点击事件分发机制
-
Android 事件分发机制详解与实战剖析 | 开发者说·DTalk
-
Android进阶必备:滑动冲突解决与事件分发机制(附视频讲解)这篇看完还不懂请寄刀片