如果接触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. base关键字

    base关键字      专门用来在子类访问父类成员 base.标识符:“.”调用父类同名属性.同名函数.构造函数 ()父类person public class Person { public Pe ...

  2. [ios2] iOS常用控件尺寸大集合 【转】

    元素控件 尺寸(PTS) Window(含状态栏) 320 x 480 Status Bar的高度 20 Navigation Bar的高度 44 含Prompt的Navigation Bar的高度 ...

  3. 实际开发中,后台回传的错误格式的Json数据处理

    现在很多学习刚学习移动开发的同学,相信在培训机构,拿到后台数据的时候,格式都是正确的,甚至有的还是plist文件.但是实际开发中,我们获取数据都是通过网络接口从服务器获取数据,这些数据的格式都是后台写 ...

  4. The Linux Mint 18.1:Eclipse Run The C++ And Python ConfigorationWhen You achieve above step,you can run the c++ and python! (Next OTL ,PYOTL is Project That Write By Ruimin Shen(ability man) )

    # Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights reserved.# 转载请注明出处 1.Install The Eclipse,g++ Use T ...

  5. Ubuntu16 64位安装steam, 并解决无法启动的问题

    直接用crtl+shift打开终端,运行下面的命令. sudo add-apt-repository multiverse sudo apt update sudo apt install steam ...

  6. 自定义连接池java.lang.ClassCastException: com.sun.proxy.$Proxy4 cannot be cast to java.sql.Connection

    原因:Connection.getInterfaces() 与数据库驱动有关,数据库驱动不同 Connection.getInterfaces() 的结果也就不同,Connection.getInte ...

  7. ie7,IE8不支持document.getElmentsByClassName的问题

    if (!document.getElementsByClassName) { document.getElementsByClassName = function(className, elemen ...

  8. mysql权限设置

    想要设定权限,必须通过root用户登录: >> grant all privileges on *.* to root@"%" identified by " ...

  9. DateTime & UTC 相互转化

    public long ToUnixTime(DateTime date) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.U ...

  10. [MFC美化] SkinMagic使用详解2- SkinMagic常用函数介绍

    SkinMagic常用函数介绍 (1)InitSkinMagicLib函数:初始化SkinMagic int InitSkinMagicLib( //初始化SkinMagic工具库 HINSTANCE ...