android事件分发的研究

最近深入的研究了一下,android的事件分发机制,看网上有朋友说研究这类源码最好研究早版本的,我选了个android-15来研究。

首先看看android.view类的事件分发

当系统检测到有触摸事件发生时首先调用view对象的dispatchTouchEvent方法
这是android.view.dispatchTouchEvent:

方法中大的来分有三个if判断,其中第一个和最后一个应该是判断是不是调试模式用的。中间一个是关键。判断条件中onFilterTouchEventForSecurity(event)用于判断事件需不需要分发————True if the event should be dispatched, false if the event should be dropped.(如果事件应该被分发返回为true,否则如果事件应该放弃掉)。如果返回是false则事件不会被处理。返回为true则处理,下面说说怎么处理:

mListenerInfo是用于存储设置的listener的对象。接下来又是一个判断

 if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                return true;
            }


注意其中有这么一条 li.mOnTouchListener != null 用于判断是不是设置了ontouchListener,还有这么一条li.mOnTouchListener.onTouch(this, event),用于执行ontouchListener的onTouch方法。如果ontouch返回为true并且能保证所有条件都成立,则dispatchtouchevent直接返回true,后面的ontouchevent就不会被调用了。

当ontouch返回为false时,继续向下判断onTouchEvent(event)的返回结果,如果返回true则dispatchtouchevent返回true否则继续到最后返回false

总结如下:

dispatchtouchevent方法的调用过程是:

1.如果有ontouchlistener,就调用ontouchlistener的ontouch方法,当这个方法返回是true就结束dispatchtouchevent(返回true);

2.如果没有ontouchlistener或者ontouchlistener的ontouch方法返回结果是false(也就是事件没有被消费掉)就调用ontouchevent并判断其返回值,当ontouchevent返回true时,事件被消费dispatchtoucheven返回true,否则最后返回false。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值