如果接触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. CALayer之mask属性-遮罩

    CALayer有一个属性叫做mask. 这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性. 它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图 ...

  2. Python学习--10 面向对象编程

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 本节对于面向对象的概念不做 ...

  3. JavaScript星级评分

    事件onmouseover <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  4. LightOJ 1030 Discovering Gold

    期望,$dp$. 设$ans[i]$为$i$为起点,到终点$n$获得的期望金币值.$ans[i]=(ans[i+1]+ans[i+2]+ans[i+3]+ans[i+4]+ans[i+5]+ans[i ...

  5. ubuntu 下 编译ffmpeg 3.1.1

    1,下载ggmpeg源码:http://ffmpeg.org/download.html 2.下载ndk ,百度 3.配置环境 3.1 编译FFMPEG时,出现了 ffmpeg yasm not fo ...

  6. [SQL基础教程] 4-2 数据删除(DELETE)

    [SQL基础教程] C4 数据更新 4-2 数据删除(DELETE) DROP TABLE / DELETE DROP TABLE - 完全删除表 DELETE - 仅删除数据,保留表容器 DELET ...

  7. C语言基础题

    1.闰年问题 例 :输入年.月判断该月的天数. #include<stdio.h> ][] = {,,,,,,,,,,,}; int main() { int p1,p2; int *p; ...

  8. thinkphp判断是否为手机

    一.问题: 近日准备给自己的网站做一个小升级,让用户在手机二维码扫描的时候显示适合手机端来展示的模版[我用的是ThinkPHP3.0],代码是参考别人的 二.实现方法: 这里先说下大概的一个思路 简单 ...

  9. django manage.py 的各种功能

    [简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ...

  10. ubuntu16.04 禁用Guest用户

    .打开终端(快捷键 Ctrl+Alt+T) .编辑50-no-guest.conf文件,按照以下命令编辑, sudo gedit /usr/share/lightdm/lightdm.conf.d/- ...