如果接触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. Git学习笔记(一)创建版本库并添加文件

    最近从廖雪峰老师的个人网站上学习git,做点笔记. ★★★★★ 先注册自己的username和email,否则会报如下错误: 注册:git config --global user.name &quo ...

  2. DW,DM,ODS的区别

    数据仓库的重要应用是将不同来源的数据和异构数据通过ETL整合在一起,为决策分析提供支撑,若在同一个数据库中分不同用户,此意义不大:假设所有有用户都在一个数据库里,如果因为某个原因数据库重启,那么会影响 ...

  3. 第六届全球游戏大会( GMGC 北京 2017 )有哪些看点?

    全球游戏大会作为亚太地区极具影响力的全球性游戏行业盛会,本次第六届全球游戏大会( GMGC 北京 2017 )将力邀全球50个国家.500多位业界领袖.5000多家企业.50000多位业界精英参展参会 ...

  4. jQuery的入门操作

    jQuery html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,add ...

  5. Centos7下建立rubymine快捷方式到侧栏或桌面

    gnome桌面的所有菜单项都存储如下位置: /usr/share/applications/ 新建一个菜单项,直接在该目录下新建一个后缀名为.desktop的文件即可. $ vi /usr/share ...

  6. Webupload + MVC 之上传下载

    最近工作中用到了 MVC 的上传及下载 , 写下感受 本项目中用到的是百度的webuploader <!--引入Jquery--> <script src="~/Conte ...

  7. flume 以 kafka 为channel 的配置

    #此配置以kafka的一个topic为channel,相比其他channel类型 file和cache 兼并了快和安全的要求!# Define a kafka channel a1.channels. ...

  8. jQuery中操作Ajax方法小结

    有时候,越深入去了解一个点,越发觉得自己无知,而之前当自己晓得一两个片面的点还洋洋自得,殊不知,这是多么讽刺 jQery对Ajax操作进行了封装,常见的 ajax()属于最底层的方法,使用频率很高的 ...

  9. Linux 操作命令列表记录

    Linux 操作命令列表记录 SSH登录 登录 ## 范式 ssh [username]@[host] ## 例 ssh -p 1222 root@10.0.0.1 使用非默认端口(ssh默认端口22 ...

  10. LCT

    一个LCT看了一天了,但是很多地方还是理解的很模糊,简单谈一下理解. LCT支持的是对于森林的分裂.合并,以及查询节点的连通性等操作. 对于这片森林来说,它是由一坨树组成的,对于每一棵树,我们采用类似 ...