Android中View的事件分发机制——Android开发艺术探索笔记
来源:互联网 发布:淘宝上的6s官换机真相 编辑:程序博客网 时间:2024/05/20 16:41
原文链接 http://sparkyuan.me/ 转载请注明出处
介绍
点击事件的事件分发就是对MotionEvent事件的分发过程,当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发的过程。
涉及到的三个方法
- dispatchTouchEvent:用来进行事件的分发,如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和View的dispatchTouchEvent方法的影响,表示是否当消耗当前事件
- onInterceptTouchEvent:用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件;
- onTouchEvent:在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。
三个方法之间的关系
public boolean dispatchTouchEvent(MotionEvent ev) { boolean consume = false; if(onInterceptTouchEvent(ev)) { consume = onTouchEvent(ev); } else { consume = child.dispatchTouchEvent(ev); } return consume; }
上面的伪代码很好的描述了三者之间的关系。如果当前View拦截事件,就交给自己的onTouchEvent去处理,否则就传给子View,直到事件被最终处理。
事件分发顺序
当一个点击事件产生后,它的传递过程如下:Activity -> Window -> View。如果View的onTouchEvent返回false,那么它的父容器onTouchEvent将会被调用,以此类推,最终将由Activity的onTouchEvent处理。
Activity对事件的分发过程
Activity -> Window -> DecorView。
Windows是一个抽象类,可以控制顶级View的外观和行为策略,PhoneWindow是这个类的唯一个实现。
DecorView就是当前界面的底层容器,即setContentView所设置的View是它的一个子View。
顶级View对点击事件的分发过程
ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent
顶级View一般都是一个ViewGroup。拦截事件之后,如果ViewGroup设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。如果onTouchEvent设置了mOnClickListener,则Listener里的onClick会被调用。如果ViewGroup没有拦截则传给子View直到整个事件分发完成。
View对点击事件的处理过程
如果View设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。如果onTouchEvent设置了mOnClickListener,则Listener里的onClick会被调用。
View没有onInterceptTouchEvent方法,一旦有点击事件传递给他,他就会处理。
注:上面只是描述了事件分发过程的原理,关于源码的分析请参考书本的相应章节。
欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50738102
- Android中View的事件分发机制——Android开发艺术探索笔记
- View的事件分发机制——Android开发艺术探索笔记
- 《Android开发艺术探索》——View事件分发机制
- View的事件分发机制《android开发艺术与探索》
- Android——View的事件分发机制(学习Android开发艺术探索)
- Android 开发艺术探索笔记-View的事件分发
- 读《android开发艺术探索》笔记一:View的事件分发机制
- View的事件分发机制(Android开发艺术探索学习笔记)
- 《Android开发艺术探索》之View事件分发机制
- 《Android开发艺术探索》--View事件分发
- Android 读书笔记:View的事件分发机制 源码详解 ------《Android开发艺术探索》
- Android开发艺术探索学习-View的事件分发机制(一)
- Android开发艺术探索学习-View的事件分发机制(二)
- Android开发艺术探索笔记(11)- View的事件分发
- Android View的事件分发机制探索
- Android View的事件分发机制探索
- Android View的事件分发机制探索
- 《Android开发艺术探索》——View的事件体系
- exe注册成windows服务
- 《算法技术手册》相关笔记-第四章排序
- notification学习--持续更新中。。。
- iOS之新建xib无法通过拖动调整大小
- WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
- Android中View的事件分发机制——Android开发艺术探索笔记
- ORACLE里几种锁模式
- incredibuild 命令行 error D8037
- 欢迎使用CSDN-markdown编辑器
- 数据库应用-XML数据存储(XML Speicherung)-2
- c语言入门之项目4.3——利用for循环求1-1/2*2+1/2*2*2...-1/2*2*2*2到2的8次方
- webstorm Can't use Subversion command line client: svn
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
- Spring代码分析一:加载与初始化