原文链接 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

最新文章

  1. Python快速教程目录(转)
  2. HTTP真的很简单
  3. AjaxUploader使用
  4. SQLServer处理行转列和列转行
  5. 用PowerDesigner将SQL语句生成实体类
  6. 说说C#中IList与List区别
  7. JDO持久 (jdbc ejb)
  8. 代码重构-3 用Tuple代替 out与ref
  9. Java二维码登录流程实现(包含短地址生成,含部分代码)
  10. Swift主题色顶级解决方案一
  11. oracle 查询
  12. ural 1932 The Secret of Identifier (容斥原理)
  13. 一段代码详解JavaScript面向对象
  14. Android P添加一个可以让system_server进程访问的hal service需要改动的sepolicy文件
  15. IDF-cookie欺骗
  16. TestLink环境搭建及用例导入
  17. Centos install Python3
  18. 配置一个 Confluence 6 环境
  19. Vue常见组件
  20. CentOS 7.4编译安装Nginx1.10.3+MySQL5.7.16

热门文章

  1. Visual Studio 2013 中使用断点
  2. xtu数据结构 C. Ultra-QuickSort
  3. ubuntu 转换图片格式的方法(sam2p, imagemagick)
  4. 13-数组的API方法遍历
  5. 快速排序php
  6. 【Luogu】P3052摩天大楼里的奶牛(状压DP)
  7. 算法复习——欧拉回路混合图(bzoj2095二分+网络流)
  8. 征途(bzoj 4518)
  9. 小Z的袜子(bzoj 2038)
  10. R语言入门--画图(一)--需要注意的地方