android 事件分发机制

1. 定义?

2. MotionEvent的具体动作?

 

3. 事件分发的本质?

将点击事件传递到具体的view处理的整个过程

事件传递的过程=分发过程

4. 事件在哪对象之间进行传递?

5. 具体分发事项?

public boolean dispatchTouchEventMotionEvent ev

用来进行事件的分发。如果当前事件能够传递给当前view,那么此方法一定会被调用,返回结果受当前ViewonTochEvent和下级viewdispatchTouchEvent方法的影响,表示是否消耗当前事件。

public boolean onInterceptTouchEventMotionEvent ev

在上述方法内部调用,用来判断是否拦截某个事件,如果当前view拦截了某个事件,

那么在同一个事件序列当中,此方法不会再次调用,返回结果表示是否拦截当前事件。

 

public boolean onTouchEventMotionEvent ev

dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前view无法再次接受到事件。

对于一个根viewgroup来说,点击事件产生后,首先会传递给它,这时它的dispatchTouchEvent就会被调用,如果这个viewgrouponInterceptTouchEvent方法返回true就表示它要拦截当前事件,接着事件就会交给这个viewgroup处理,即它的onTouchEvent方法就会被调用;如果这个viewgrouponInterceptTouchEvent返回false就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用,如此反复直到事件被最终处理。

 

但我们需要考虑一种情况,如果一个viewonTouchEvent返回false,那么它的父容器的onTouchEvent将会被调用。eg.上级分给了一个程序员去处理(这是事件分发的过程),结果这个程序员搞不定,就会交给上一级进行处理。上级处理不了,会交给上上级,这样一层一层往上抛。

 

默认:往下分发

 

True:拦截处理

False:往上抛(执行上级的onTouchEvent

注:只有viewgroup才有拦截方法

Viewgroup(相对布局,线性布局,帧布局)

Activity  return  false时执行onTouchEvent  

return  true时不执行onTouchEvent

如果view需要处理事件时,如果它设置了OnTouchListener,那么OnTouchListener中的onTouch方法会被调用。这时事件如何要看onTouch的返回值,如果返回false则调用当前viewonTouchEvent方法会被 调用,如果返回true则不会调用onTouchEventViewOnTouchListener其优先级比onTouchEvent要高。在onTouchEvent中设置OnClickListener,那么它的onClick方法会被调用。OnTouchListener的优先级最低,即处于事件传递的尾端。

 

Activity存储在DecorView中,DecorView继承于FrameLayout,最终为viewgroup

顶级view叫根view,一般来说都是viewgroup

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值