Android事件分发笔记
2015-06-23 15:52
387 查看
一、事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
当有监听到事件时,首先由Activity的捕获到,进入事件分发处理流程。如果事件分发返回true,表示改事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结。如果事件分发返回false,表明事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费。如果事件分发返回系统默认的super.dispatchTouchEvent(ev),事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理(如果有的话)。如果没有onInterceptTouchEvent方法,交给子view的dispatchTouchEvent(ev)进行处理。
二、事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
如果onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由本层控件的onTouchEvent 进行处理;如果返回结果false,则表示不对事件进行拦截,事件得以成功分发到子View。并由子View的dispatchTouchEvent进行处理。如果返回super.onInterceptTouchEvent(ev),事件默认不会被拦截,交由子View的dispatchTouchEvent进行处理。另外如果onInterceptTouchEvent返回true成功拦截事件,并且后续onTouchEvent在本层成功消费,后续事件就无需执行本层的onInterceptTouchEvent事件。
三、事件响应:public boolean onTouchEvent(MotionEvent ev)
如果onTouchEvent返回true,表示onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。如果onTouchEvent返false,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层View的onTouchEvent进行处理,并且事件有记忆功能,下次事件不会分发到该层的dispatchTouchEvent。如果返回super.onTouchEvent(ev),则根据对应View的clickable属性决定返回的是true还是false(例如Button则返回true,TextView则返回false)。总结:从以上过程中可以看出,dispatchTouchEvent无论返回true还是false,事件都不再进行分发,只有当其返回super.dispatchTouchEvent(ev),才表明其具有向下层分发的愿望,但是是否能够分发成功,则需要经过事件拦截onInterceptTouchEvent的审核。事件是否具有冒泡特是由onTouchEvent的返回值决的。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories