一、与触摸事件有关的几个方法

boolean dispatchTouchEvent(MotionEvent ev);
接收到触摸事件时,是否分发事件到下面的View

返回true:分发触摸事件

返回false:不分发,下面的View就拿不到触摸事件
boolean onInterceptTouchEvent(MotionEvent ev);
接收到触摸事件时,是否拦截事件

返回true:拦截,则调用onTouchEvent方法处理事件

返回false:不拦截,事件继续往子View传
boolean onTouchEvent(MotionEvent ev);
是否响应事件

返回true:响应

返回false:不响应
boolean onTouch(View v, MotionEvent event);
是否响应事件,当View调用了setOnTouchListener方法设置了触摸监听器,则事件响应的时候先调用onTouch方法

返回true:响应,则onTouchEvent方法不执行

返回false:不响应,并调用onTouchEvent方法
void requestDisallowInterceptTouchEvent(boolean disallowIntercept);
请求父控件是否不拦截事件

返回true:不允许父控件的onInterceptTouchEvent调用

返回false:允许调用

二、拥有这些方法的类

父类 子类 拥有的方法
Activity Activity dispatchTouchEvent、onTouchEvent


ViewGroup
RelativeLayout, LinearLayout... dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent、requestDisallowInterceptTouchEvent
View Button、TextView... dispatchTouchEvent、onTouchEvent

三、事件处理规则

触摸事件是从Activity分发(只是分发,还没有处理)到父控件,父控件先判断是否拦截,如果不拦截事件,则继续分发到子控件,然后一直往下分发。但处理就刚好相反,由子控件先处理事件,如果子控件没有处理事件,则交给到父控件处理,一直往上处理,直到哪个控件处理了触摸事件,就事件处理就到此结束。

1.当用户触摸屏幕的时候,从按下到移动,最后到抬起,会依次产生ACTION_DOWN、ACTION_MOVE、ACTION_UP三种触摸事件,事件先传到Activity,然后Activity调用分发事件方法dispatchTouchEvent,如果返回true,则事件就会传给Activity的第一个父控件。

2.父控件拿到事件之后,也会调用分发事件方法dispatchTouchEvent,如果返回true,则继续调用拦截方法onInterceptTouchEvent,如果返回true,则父控件拦截了事件,并调用父控件的onTouchEvent方法,下面的子控件就不会再响应onTouchEvent,onTouch的方法。

3.子控件拿到事件之后,先判断是否设置了OnTouchListener, 如果设置了,则调用OnTouchListener的onTouch方法,如果返回true,事件已经处理到此结束,则跳过onTouchEvent方法,否则调用onTouchEvent方法,当onTouchEvent方法返回true,则事件处理到此结束,上面的父控件就不会再调用onTouchEvent方法。

4.如果某一个控件响应了ACTION_DOWN事件,则后续的ACTION_MOVE、ACTION_UP事件就会直接交给该控件处理,除非它的父控件拦截了后续的事件,但可以在处理ACTION_DOWN事件时,调用requestDisallowInterceptTouchEvent禁止父控件的拦截。如果控件没有处理ACTION_DOWN事件,则后续的事件就不会再传到该控件中,当下一次的ACTION_DOWN事件产生时,还是会传给该View的。

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

  1. Android事件分发传递回传机制详解

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接   http://blog.csdn.net/qq_32059827/article/details/5257701 ...

  2. Android事件分发与责任链模式

    一.责任链模式 责任链模式是一种行为模式,为请求创建一个接收者的对象链.这样就避免,一个请求链接多个接收者的情况.进行外部解耦.类似于单向链表结构. 优点: 1. 降低耦合度.它将请求的发送者和接收者 ...

  3. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  4. Android事件分发机制(下)

    这篇文章继续讨论Android事件分发机制,首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子 ...

  5. Android事件分发机制(上)

    Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...

  6. android事件分发机制

    android事件分发机制,给控件设置ontouch监听事件,当ontouch返回true时,他就不会走onTouchEvent方法,要想走onTouchEvent方法只需要返回ontouch返回fa ...

  7. [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...

  8. android事件分发介绍

        Android事件分发 事件分发3个步骤 dispatchTouchEvent(event)派发 onInterceptTouchEvent(event)拦截 onTouchEvent(eve ...

  9. Android事件分发理解

    Android事件分发机制是个难点和重点,结合下各家,写点自己的理解.. 首先抛出一个小问题,写一个button的点击事件 button.setOnClickListener(new OnClickL ...

随机推荐

  1. 远程ssh登陆时报错:/bin/bash: Permission denied

    远程普通用户ssh登录时,提示/bin/bash: Permission denied,用户名mas,密码正确. 首先上个图,用户远程登录步骤,转自http://www.tldp.org/LDP/LG ...

  2. mmap为什么比read/write快(兼论buffercache和pagecache)

    参考文献: <从内核文件系统看文件读写过程>http://www.cnblogs.com/huxiao-tee/p/4660352.html?utm_source=tuicool& ...

  3. axis2 调用webservice

    maven配置:主要引用包及plugins <properties> <axis2.version>1.6.1</axis2.version> </prope ...

  4. Nginx + Tomcat Windows下的负载均衡配置

     Nginx + Tomcat Windows下的负载均衡配置 一.为什么需要对Tomcat服务器做负载均衡?    Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过50 ...

  5. CentOS7 下ifconfig command not found解决办法

    今天尝鲜用VMWare安装了CentOS7,选择了最小安装包模式,安装完毕之后想查看一下本机的ip地址,发现报错 # ifcon -bash: ifconfig: command not found ...

  6. mysql 有报错  ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists

    sh-4.1# /etc/init.d/mysqld status ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql ...

  7. javascrip中cookie的使用详细分析

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  8. JDBC URL FOR ORACLE, wrong or correct, how do you know? ORA-12505

    JDBC URL FOR ORACLE, wrong or correct, how do you know? INSTANCE SID by ":" jdbc:oracle:th ...

  9. C# 通过模拟http请求来调用soap、wsdl

    C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题. 由于远程API不在我们的控制下,我们只能修改本地的调用代码 ...

  10. Tomcat 9.0安装配置(转)

    http://www.cnblogs.com/saratearing/p/5811866.html