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。
首先看看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。
相关文章推荐
- Android群英传第五章Scroll分析读书笔记
- android 常见对话框写法
- androidannotations摘要
- Android 对话框简单写法
- Ubuntu15.10 编译 Android5.0 源码
- 谷歌安卓官方文档之已知的问题
- 国内android资源备份很全的一个站
- Android系统各版本号及代号
- Android如何设置背景透明、开关输入法、改变标题栏颜色、layer-list
- Android SlidingMenu 开源项目 侧拉菜单的使用(详细配置)
- Android SlidingMenu 使用详解
- Android中获取全局Context
- android WebView加载 assets html文件
- Android 最简单的导航栏实现
- 1、Android代码命名规范
- android--调用系统相机拍照,显示并保存照片 - zhengwen
- Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里都有
- Android中JNI的使用方法
- Android 判断当前网络状态
- Android AsyncTask onProgressUpdate 方法的些许研究