您的位置:首页 > 移动开发 > Android开发

android事件分发的研究

2015-12-17 22:16 288 查看
最近深入的研究了一下,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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: