如果接触android开发时间足够长的话,或多或少都会遇到各种各样事件冲突的问题,要想解决这类问题,对深入理解事件分发机制是很有必要的,接下来几天都会尽自己所能尽可能将这方面讲清楚。

 View的事件分发主要还是对触摸操作,按下,滑动,抬起过程中的事件处理;而所有的触摸事件都被封装在MotionEvent里面;那么MotionEvent包括哪些事件类型呢?

  1. Action_Down -- 手指按下的时候;
  2. Action_Move--手指在屏幕上移动的时候;
  3. Action_Up--手指抬起的时候;
  4. ACTION_CANCEL--动作取消;
  5. ACTION_OUTSIDE--动作超出边界的情况;
  6. ACTION_POINTER_DOWN 多点按下
  7. ACTION_POINTER_UP 多点弹起

一次完整的事件都要经历从按下到抬起的整个过程,也就是说要经历Action_Down-->Action_Up的整个流程。

事件的分发处理主要依靠如下三个方法来进行处理:

  1. dispatchTouchEvent():用来进行事件分发,返回true,当前view消费事件,并停止下发,否则事件交给父view的onTouchEvent来进行处理。
  2. onInterceptTouchEvent()用来拦截事件,返回true,交给自己的onTouchEvent来进行处理,false,交给子View的onInterceptTouchEvent来处理。
  3. ontouchEvent()用来处理点击事件,返回true,处理事件,返回false,拦截事件并处理。

ViewGroup和View的区别:

View没有拦截事件onInterceptTouchEvent事件,而ViewGroup上面事件都有。

ViewGroup:

当点击的时候,dispatchTouchEvent会被调用,onInterceptionTouch方法为true,就拦截事件,并将事件交给ontouchEvent来处理;onInterceptionTouch方法为false,不拦截事件,事件继续向下传递,子view可能是viewgroup也有可能是view。如果是viewGroup,则处理对应前面的内容,不断循环,直到view。

View:

  1. 设置ontouchListener:回调ontouch事件,如果ontouch返回false,ontouchEvent会被调用,否则,不会调用。处理的优先级outouchListener>ontouchEvent>onclicklistener。
  2. 事件传递顺序:activity -->window -->view,view的onTouchEvent返回false,父容器onTouchEvent将会调用,如果都不处理,最后传递给activity处理。
  3. viewGroup默认不拦截任何事件。onIntercepTouchEvent默认返回false。
  4. View默认没有onIntercepTouchEvent事件,事件传递到View,onTouchEvent会被调用。
  5. 事件总是先传递给父组件,再传给子组件,子组件通过requestDisallowInterceptTouchEvent干预父组件的事件分发。

Android View的事件分发的更多相关文章

  1. Android View 的事件分发原理解析

    作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...

  2. Android View的事件分发机制

    准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...

  3. Android View的事件分发机制和滑动冲突解决方案

    这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...

  4. Android view 的事件分发机制

    1 事件的传递顺序是 Activity -> Window -> 顶层View touch 事件产生后,最先由 activity 的 dispatchTouchEvent 处理 /** * ...

  5. Android View的事件分发机制探索

    概述 Android事件传递机制也是Android系统中比较重要的一块,事件类型有很多种,这里主要讨论TouchEvent的事件在framework层的传递处理机制.因为对于App开发人员来说,理解f ...

  6. 《Android View 的事件分发和滑动冲突》 —预习资料

    1. 阅读书籍<Android开发艺术探索>第三章 2. 提前阅读如下技术文章: http://blog.csdn.net/singwhatiwanna/article/details/3 ...

  7. Android事件分发机制详解(1)----探究View的事件分发

    探究View的事件分发 在Activity中,只有一个按钮,注册一个点击事件 [java] view plaincopy button.setOnClickListener(new OnClickLi ...

  8. 【Android - 自定义View】之View的事件分发机制

    参考资料: View事件分发:http://blog.csdn.net/pi9nc/article/details/9281829 ViewGroup事件分发:http://blog.csdn.net ...

  9. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...

随机推荐

  1. Kettle的应用——对mysql数据进行表输入与导出

    Kettle的应用——对mysql数据进行表输入与导出 1. 下载好kettle解压包 网址:http://sourceforge.net/projects/pentaho/files/Data%20 ...

  2. webpack中加载CSS

    webpack强大之处在于可以将CSS当做一个资源模块进行管理和加载 基本使用: 安装webpack的加载插件style-loader和css-loader: npm install style-lo ...

  3. 结构-行为-样式 - Angularjs 环境下Ztree结合JqueryUI实现拖拽

    新的项目中有一个需求是要求客户标签可以自定义,于是就想到了客户体验,让客户自己拖拽标签进行组合查询.但是理想很丰满,现实很骨感.一开始就遇到了问题,各个插件之间的结合问题,折腾一翻之后终于实现了这个功 ...

  4. C语言之数组

    数组 数组就是在内存空间中,开辟一个大的空间,然后再将这个大的空间均的分为若干份的小空间,每个小空间用来保存一个数据. 1). 数组的专业术语: 长度:指的能存放数据的个数 下标/索引:每一个数据所在 ...

  5. 制作类似ThinkPHP框架中的PATHINFO模式功能(二)

    距离上一次发布的<制作类似ThinkPHP框架中的PATHINFO模式功能>(文章地址:http://www.cnblogs.com/phpstudy2015-6/p/6242700.ht ...

  6. 构建jenkins

    一.Jenkins简介:    jenkins,之前叫做Hudson,是基于Java开发的一种持续集成工具,用户监控秩序重复的工作,包括: 1>持续的软件版本发布测试项目. 2>监控外部调 ...

  7. Docker 搭建 etcd 集群及管理

    环境 host1 10.1.99.13 host2 10.1.99.14 host3 10.1.99.15 host4 10.1.99.12(用于测试添加删除节点) 初始化集群 host1 $ doc ...

  8. WebService一、数据交互

    调用webservice总结:  1.加入第三方的jar包 Ksoap2-android-XXX    2.访问响应的webservice的网站,查看响应的信息,得到nameSpace,methodN ...

  9. 【01背包】HDU 2546 饭卡

    Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) ...

  10. ssh爆破脚本

    前些天,基友发我一个ssh爆破工具,看起来很吊的样子.然后我就无聊自己写了个py脚本的. 单线程:慢成狗----- #coding:utf-8 #author:jwong import threadi ...