Android View 点击事件的分发机制
2016-07-21 18:18
253 查看
最近一直在研究android的源码,理解view点击事件的分发机制,对android开发有很大的帮助。本文首先,介绍MotionEvent,然后介绍创建activity时,view是怎么创建的,最后从viewgroup 和view 出发介绍点击事件的分发机制。
MotionEvent 有三种状态
Action_Down :手指放接触屏幕
Action_Move :手指在屏幕上面移动
Action_up :手指从屏幕松开
当一个 MotionEvent 产生后,系统需要将这个事件交给一个具体的View处理,就是我们的事件分发机制。我们创建一个Activity的时候,会调用setContentView()添加xml文件,实际上是先通过Window的唯一实现类Phonewindow,获得DecorView , DecorView 一般是一个标题栏和内容块组成,而我们通过setContentView()添加的布局,实际上就是放在了DecorView的内容块上。所以点击事件发生后,传递过程是activity->window(PhoneWindow) -> DecorView -> view 。
(盗取别人一张图)
对于ViewGroup,点击事件产生后,会调用dispatchTouchEvent 、onInterceptTounchEvent 、 onTouchEvent三个方法。首先调用dispatchTouchEvent进行点击事件的分发,在这个方法中会先调用onInterceptTounchEvent 方法,判断当前的ViewGroup是否拦截这个点击事件,如何返回true,那么这个点击事件交给ViewGroup 处理,接着调用ViewGroup的onTouchEvent进行处理。默认情况下,onIterceptTounchEvent 返回为false,dispatchTouchEvent 方法就会遍历ViewGroup的所有子View,直到这个点击事件被处理。如果ViewGroup的所有子View都不处理,那么最终还是交给ViewGroup处理。
针对单个View,点击事件产生后,主要调用dispatchTouchEvent 、onTouchEvent 这两个方法。dispatchTouchEvent不再是分发点击事件,而是view判断是否处理这个点击事件,如果处理,就会调用onTouchEvent 方法。这里需要注意,如果view设置了OnTouchListener,会优先把点击事件给onTouch方法处理。所以onTouch优先于onTouchEvent 。
以上就是完整的事件分发机制。
MotionEvent 有三种状态
Action_Down :手指放接触屏幕
Action_Move :手指在屏幕上面移动
Action_up :手指从屏幕松开
当一个 MotionEvent 产生后,系统需要将这个事件交给一个具体的View处理,就是我们的事件分发机制。我们创建一个Activity的时候,会调用setContentView()添加xml文件,实际上是先通过Window的唯一实现类Phonewindow,获得DecorView , DecorView 一般是一个标题栏和内容块组成,而我们通过setContentView()添加的布局,实际上就是放在了DecorView的内容块上。所以点击事件发生后,传递过程是activity->window(PhoneWindow) -> DecorView -> view 。
(盗取别人一张图)
对于ViewGroup,点击事件产生后,会调用dispatchTouchEvent 、onInterceptTounchEvent 、 onTouchEvent三个方法。首先调用dispatchTouchEvent进行点击事件的分发,在这个方法中会先调用onInterceptTounchEvent 方法,判断当前的ViewGroup是否拦截这个点击事件,如何返回true,那么这个点击事件交给ViewGroup 处理,接着调用ViewGroup的onTouchEvent进行处理。默认情况下,onIterceptTounchEvent 返回为false,dispatchTouchEvent 方法就会遍历ViewGroup的所有子View,直到这个点击事件被处理。如果ViewGroup的所有子View都不处理,那么最终还是交给ViewGroup处理。
针对单个View,点击事件产生后,主要调用dispatchTouchEvent 、onTouchEvent 这两个方法。dispatchTouchEvent不再是分发点击事件,而是view判断是否处理这个点击事件,如果处理,就会调用onTouchEvent 方法。这里需要注意,如果view设置了OnTouchListener,会优先把点击事件给onTouch方法处理。所以onTouch优先于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