欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android开发之事件分发机制实例讲解

程序员文章站 2024-02-01 12:07:16
1.定义? 2.motionevent的具体动作? 3.事件分发的本质? 将点击事件传递到具体的view处理的整个过程 事件传递的过程=分发过程 4.事件在哪对象之间进行传递? 5.具体分发事项?...

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