Android事件分发机制和一些疑问

原创 2015年07月09日 13:22:15

 

Android中事件分发机制介绍,该文章主要是针对了解Android事件分发机制的人,旨在提出一些问题,并附上一些理解,就此写下供大家交流,也做一个存档。

         ViewGroup中包含三个方法:

                   public   boolean   dispatchTouchEvent(MotionEvent ev) 事件分发

                   public   boolean   onInterceptTouchEvent(MotionEvent ev)   事件拦截

                   public  boolean    onTouchEvent(MotionEventev) 事件响应

         View和Activity中包含两个方法:

                  public   boolean   dispatchTouchEvent(MotionEvent ev) 事件分发  

                  public   boolean   onTouchEvent(MotionEventev) 事件响应

 

方法解释:

public   boolean   dispatchTouchEvent(MotionEvent ev) 事件分发

             return   true:事件停止分发,并交给当前控件的onTouchEvent处理

             return   false:事件继续向子控件分发,知道最内层View停止

       public   boolean   onInterceptTouchEvent(MotionEvent ev)   事件拦截

             return   true:事件停止分发,并交给当前控件的onTouchEvent处理

             return   false:事件不进行拦截,dispatchTouchEvent可以继续分发

        public   boolean   onTouchEvent(MotionEventev) 事件响应 

             return   true:事件已经消费,并在该onTouchEvent中进行处理

             return   false:事件未消费,向父控件的onTouchEvent传递,指导Activity停止

 

设置布局如下图所示:

     

 

         当触摸屏幕中的Button时,Activity首先调用dispatchTouchEvent方法,该方法返回false是向子控件分发,返回true交个自身的onTouchEvent处理;

         Activity的子控件也做类似的处理,直到最内层的Button,该Button判断事件是否在onTouchEvent中处理,如果该方法返回true表示事件已经被消耗,不再向其父控件的onTouchEvent传递;如果返回false,则将事件传递给其父控件的onTouchEvent方法,然后进行相同的处理。如下图所示:

 

 

注意:

1、   onInterceptTouchEvent方法是被dispatchTouchEvent方法调用的,作为dispatchTouchEvent的一个判断分支(判断是否拦截事件),如果onInterceptTouchEvent返回true,则交给该控件的onTouchEvent进行处理,否则dispatchTouchEvent继续向子控件分发事件

2、   关于onTouch和onTouchEvent的冲突。

a)        如果onTouch存在,则onTouch优先于onTouchEvent执行

b)        在源码中View中的dispatchTouchEvent方法中对onTouch的执行条件进行了判断;如果条件成立则执行onTouch,否则执行onTouchEvent;但是在ViewGroup中的dispatchTouchEvent方法中并没有类似判断。此处我只能暂时认为只有在View中才会有onTouchonTouchEvent的冲突,而在ViewGroup中没有冲突(个人观点)。此处存在疑问,由于我不愿意再看源码,所以望大家多多指点

3、   onTouchEvent和onTouch同时存在的问题,这条纯属个人观点,望大家指点。

由于onTouchEvent中实现了点击、长按等事件,所以必须要存在;而onTouch则可以更多样化处理触摸操作,方便提高用户体验吧

4、   关于View中onTouch和onTouchEvent冲突的解决:

a)        由于onTouch先于onTouchEvent执行,所以在onTouch方法中的返回值必须是false,只有这样时间才能够传递到onTouchEvent方法中。

b)        如果这样的话,onTouch只能处理DOWN事件,对于后续的MOVE和UP,没有办法处理

5、关于onTouch出来捣乱的部分,大家需要多多注意,至于我也没有弄清楚。

 

 

 

参考文献:

Android 编程下 Touch 事件的分发和消费机制

http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html

 

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

http://blog.csdn.net/pi9nc/article/details/9281829

 

                                            

Android:30分钟弄明白Touch事件分发机制

http://www.cnblogs.com/linjzong/p/4191891.html

 

Android触摸事件分发机制

http://hunankeda110.iteye.com/blog/1944311

 

android 事件分发机制

http://blog.csdn.net/lanhuzi9999/article/details/26515421

 

Android手势事件分发过程分析

http://blog.csdn.net/xu_fu/article/details/32937959

 

Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

http://blog.csdn.net/jiangwei0910410003/article/details/17504315

 

 

 

 

 

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处!

android之View和ViewGroup事件分发机制分析(一)(View的事件分发机制)

要把安卓学好,自定义View,事件分发机制,自定义动画之类的是必须掌握的,如果不想弄得那么高级来自定义,也可以不学。当初自己也是看了很多相关的书籍和博客文章,理了很久的思路。现在事件分发机制的分析已经...
  • gsw333
  • gsw333
  • 2016年07月25日 19:10
  • 633

Android ViewGroup事件分发机制

上一篇已经完整的解析了Android View的事件分发机制,今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对V...
  • lmj623565791
  • lmj623565791
  • 2014年09月09日 09:38
  • 78190

Android事件分发机制 详解攻略,您值得拥有

前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化等等 今天,我...
  • carson_ho
  • carson_ho
  • 2017年01月06日 11:43
  • 38683

一步步理解Android事件分发机制

回想一下,通常在Android开发中,我们最常接触到的是什么东西?显然除了Activity以外,就是各种形形色色的控件(即View)了。 与此同时,一个App诞生的起因,终究是根据不同需求完成与用户...
  • ghost_Programmer
  • ghost_Programmer
  • 2016年07月21日 18:57
  • 2720

android事件分发机制解析(配流程图)

事件分发机制 一.点击事件传播路径 1.点击事件TouchEvent最先是到达Activity的,然后传给Activity对应的window,再传给DecorView,再传给id为content的...
  • sggdjfkf147896325
  • sggdjfkf147896325
  • 2016年07月20日 11:29
  • 522

Android开发中的事件分发机制梳理

本文为事件分发的学习总结。 《Android开发艺术探索》一书中对事件分发做了很详细的介绍。 大神博客:http://blog.csdn.net/singwhatiwannaView的事件分发机制...
  • android_zyf
  • android_zyf
  • 2017年03月05日 12:55
  • 779

【Android面试笔记】(一)事件分发机制

首先我们必须了解三个方法 1.dispatchTouchEvent 2interceptTouchEvent      3.TouchEvent 下面先介绍第一个:dispatchTouchEvent...
  • u011669081
  • u011669081
  • 2015年10月18日 18:19
  • 1617

android 事件分发机制

前段时间做项目的时候,碰见listview
  • lanhuzi9999
  • lanhuzi9999
  • 2014年05月22日 02:09
  • 20904

android面试题之触摸事件分发与处理简述

android触摸事件分发与处理     android的分发机制:由父控件判断是否拦截,如果不拦截事件,则继续分发到子控件,然后一直分发下去。     处理:与分发相反,由子控件先处理事件,如果子控...
  • qq_35366908
  • qq_35366908
  • 2016年06月21日 10:23
  • 1236

Android事件分发机制练习---打造属于自己的瀑布流

坚持一件对自己有益的事!!!
  • dmk877
  • dmk877
  • 2015年10月16日 10:04
  • 1419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android事件分发机制和一些疑问
举报原因:
原因补充:

(最多只允许输入30个字)