Android事件分发机制
2016-07-28 09:16
267 查看
Android事件的传递路其实是一个递归的过程,默认情况下:首先事件由Activity传递下来,依次调用ViewGroup 、View的dispatchTouchEvent 方法,然后又从View开始依次调用View、ViewGroup、Activity的onTouch方法,整个事件的传递过程类似于一个“U”型,下面给出一个图:
(严格说,上图针对于ACTION_DOWN事件)
总结几点:
1、Activity的dispatchTouchEvent方法无论返回什么,都会调用ViewGroup的dispatchTouchEvent
2、ViewGroup、View的方法返回true,就会消耗掉此事件,不会再往下面传递,当然也包括上层的回溯
3、ViewGroup想把事件直接分发给自己的onTouchEvent方法,则重写onInterceptTouchEvent方法,让它返回true。onInterceptTouchEvent方法其实是一个拦截器,表示是否拦截此事件,不让事件再分发给ViewGroup的子View。默认返回false表示不拦截,true表示拦截。
4、ACTION_MOVE、ACTION_UP和ACTION_DOWN在默认情况下,事件的传递是一样的,但是在重写了修改了返回值的情况下,前两者的事件传递规则是:事件是在哪个控件消耗掉的,那么ACTION_MOVE、ACTION_UP事件就会从上往下传递到这个控件就止住了,如果是在onTouchEvent方法消耗掉的,那么还会调用此控件的onTouchEvent方法。如下图:
(严格说,上图针对于ACTION_DOWN事件)
总结几点:
1、Activity的dispatchTouchEvent方法无论返回什么,都会调用ViewGroup的dispatchTouchEvent
2、ViewGroup、View的方法返回true,就会消耗掉此事件,不会再往下面传递,当然也包括上层的回溯
3、ViewGroup想把事件直接分发给自己的onTouchEvent方法,则重写onInterceptTouchEvent方法,让它返回true。onInterceptTouchEvent方法其实是一个拦截器,表示是否拦截此事件,不让事件再分发给ViewGroup的子View。默认返回false表示不拦截,true表示拦截。
4、ACTION_MOVE、ACTION_UP和ACTION_DOWN在默认情况下,事件的传递是一样的,但是在重写了修改了返回值的情况下,前两者的事件传递规则是:事件是在哪个控件消耗掉的,那么ACTION_MOVE、ACTION_UP事件就会从上往下传递到这个控件就止住了,如果是在onTouchEvent方法消耗掉的,那么还会调用此控件的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