android触摸事件分发机制

原创 2015年11月18日 12:52:29

一、Android触摸事件分发机制概述:

Android如此受欢迎,就在于其优秀的交互性,这其中,Android优秀的事件分发机制功不可没。那么,作为一个优秀的程序员,要想做一个具有良好交互性的应用,必须透彻理解Android的事件分发机制。

要想充分理解android的分发机制,需要先对以下几个知识点有所了解:

①   View和ViewGroup什么?

②   事件

③   View 事件的分发机制

④   ViewGroup事件的分发机制

下面,就让我们沿着大致方针,开始事件分发的探究之旅吧……

二、View和ViewGroup:

Android的UI界面都是由View和ViewGroup及其派生类组合而成的。其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的,也就是说ViewGroup的父类就是View。

通常来说,Button、ImageView、TextView等控件都是继承父类View来实现的。RelativeLayout、LinearLayout、FrameLayout等布局都是继承父类ViewGroup来实现的。

事件:

当手指触摸到View或ViewGroup派生的控件后,将会触发一系列的触发响应事件,如:

onTouchEvent、onClick、onLongClick等。每个View都有自己处理事件的回调方法,开发人员只需要重写这些回调方法,就可以实现需要的响应事件。

而事件通常重要的有如下三种:

MotionEvent.ACTION_DOWN  按下View,是所有事件的开始

MotionEvent.ACTION_MOVE   滑动事件

MotionEvent.ACTION_UP       与down对应,表示抬起

三、事件传递的三个阶段

  1> 事件分发(dispatch):事情的分发对应着dispatchTouchEvent方法,android系统中,所有的触摸事件都是通过这个方法来分发的,方法原型如    下:public boolean dispatchTouchEvent(MotionEvent ev)

   方法返回值为true表示事件被当前视图消费掉,不在分发事件;方法返回值为super.dispatchTouchEvent表示继续分发该事件 。如果当前视图是ViewGroup及其子类,则会调用onInterceptTouchEvent方法判定是否拦截该事件。

  2> 事件拦截(Intercept):事件的拦截对应着onInterceptTouchEvent方法,这个方法只在ViewGroup及其子类中才存在,在View和Activity中是不存在的。方法的原形如下:public boolean onInterceptTouchEvent(MotionEvent ev)

   方法返回true表示拦截事件,不继续分发给子视图,同时交由自身的onTouchEvent方法进行消费,返回false或super.onInterceptTouchEvent 

表示不对事件进行拦截,需要继续传递给子视图

  3> 消费(Consume):事件的消费对应着onTouchEvent方法,方法原型为

   public boolean onTouchEvent(MotionEvent event)

   方法返回值为false表示当前视图不处理这个事件,处理会被传递给父视图的onTouchEvent方法进行处理。

在android系统中,拥有事件传递处理能力的类有以下三种

 Activity:拥有dispatchTouchEvent(Activity的dispatchTouchEvent放回的如果是true或false的时候将不会继续分发事件)和onTouchEvent两个         方法

 ViewGroup:拥有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法

 View:拥有dispatchTouchEvent和onTouchEvent两个方法

四、触摸事件传递的传递顺序如下:

    触摸事件的传递顺序是由Activity到ViewGroup,再由ViewGroup递归传递给它的子View。

    ViewGroup通过onIterceptTouchEvent方法针对事件进行拦截,如果该方法返回true,则事件不会继续传递给子View,如果返回false或者

 super.onInterceptTouchEvent,则事件会继续传递给子View。

    在子View中对事件进行消费后,ViewGroup将接收不到任何事件。  

五、TouchEvent事件传递顺序

1
2
3
dispatchTouchEvent      事件的分发操作
TouchEvent          事件处理
onInterceptTouchEvent           事件拦截操作

在Activity与View中,TouchEvent的传递会先经过 dispatchTouchEvent,然后再到onTouchEvent
在ViewGroup中,有点特殊,在dispatchTouchEvent与onTouchEvent之间,还会经过onInterceptTouchEvent这个方法

1
2
3
4
5
6
7
8
MotionEvent.ACTION_DOWN的传递
    ①Activity.dispatchTouchEvent
    ②ViewGroup.dispatchTouchEvent
    ③ViewGroup.onInterceptTouchEvent
    ④View.dispatchTouchEvent
    ⑤View.onTouchEvent (如果这里返回true,后续的MOVE,UP事件都会传递到这里处理,否则继续向下传递)
    ⑥ViewGroup.onTouchEvent (如果这里返回true,后续的MOVE,UP事件会通过ViewGroup.dispatchTouchEvent都会直接传递到这里处理,不在向下传递,否则继续向下传递)
    ⑦Activity.onTouchEvent (如果事件经过了GroupView,View,还是传到了这里,不管这里返回的是false还是true,后续的MOVE,UP事件都会直接通过Activity.dispatchTouchEvent传递到这里)

 dispatchTouchEvent方法测试 1

1
2
3
4
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    return (true || false);     // 直接返回true或者false
}

经测试在dispatchTouchEvent方法,如果没有super.dispatchTouchEvent(event)也就是没有继续父类的实现,
这里返回true,那么事件都会传到这里结束。
这里返回false,事件会直接抛到上一层的onTouchEvent事件中
{ // 说明
    在Activity的dispatchTouchEvent返回false,事件直接结束
    在ViewGroup的dispatchTouchEvent返回false,事件会直接传递到Activity.onTouchEvent中
    在View的dispatchTouchEvent返回false,事件会直接传递到ViewGroup.onTouchEvent中
}

dispatchTouchEvent方法测试 2

1
2
3
4
5
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    super.dispatchTouchEvent(event);
    return (true || false);     // 直接返回true或者false
}

测试在dispatchTouchEvent方法中加上super.dispatchTouchEvent(event)这一行
这里返回true,事件会像常规一样去传递,但是最终会传到这一层的onTouchEvent结束,相当于本层的onTouchEvent返回了true
这里返回false,事件会像常规一样去传递,最终于会在哪一层的onTouchEvent返回true结束,随便事件就会直接到那一层的onTouchEvent

ViewGroup.onInterceptTouchEvent
在这个方法中,返回true事件将会被拦截直接传递到ViewGroup的onTouchEvent中处理
在这个方法中,返回false事件向常规一样处理




版权声明:本文为博主原创文章,未经博主允许不得转载。

android中触摸事件的分发机制

  • 2015年08月25日 11:34
  • 3.66MB
  • 下载

Android6.0触摸事件分发机制解读

原文链接:Android6.0触摸事件分发机制解读 本篇博文是Android触摸事件分发机制系列博文的第一篇,带领大家从全局掌握Android触摸事件分发机制。特别声明的是,本源码解读是基于最新的A...
  • xhmj12
  • xhmj12
  • 2016年11月16日 10:53
  • 262

Android应用层View触摸事件分发机制

概述前两篇博客从源码的角度对View绘制流程进行了分析,那么当用户需要跟View进行交互的时候,比如点击按钮的时候,按钮是如何得到点击事件的呢?当用户在屏幕上进行点击或触摸的时候,事件是如何传递到各个...

Android触摸事件分发机制

最近做了一个类似桌面应用图标可以点击,长按拖动效果,然后研究了下android触摸事件机制。 Android中的事件分为按键事件和触摸事件,这里对触摸事件进行阐述。Touch事件是由一个ACTI...
  • GOO12
  • GOO12
  • 2015年03月12日 15:19
  • 325

Android中单个View的触摸事件分发机制

有时候会遇见点击事件和滑动事件冲突,一直搞不明白,接下来分析一下 如果只是点击,而没有对控件进行滑动的话,log日志如下 05-17 19:32:17.800 10211-10211/com.fa...

Android触摸事件分发机制完全解析《一》

最近在做高德地图的时候,由于用户的要求,不得不用ScrollVew嵌套MapView,虽然很官方要求不建议这样做,但也迫于无奈… 魔高一尺,道高一丈.有什么事情事程序员不能解决的,如果有那就是解决两次...

Android中触摸事件传递分发机制

触摸事件用MotionEvent表示,在Android中,一个触摸事件从产生到最终起作用,是一个很复杂的过程,但思路还是很清晰的,就是一层一层的传递,通过一个boolean值判断是否拦截或者消耗(也就...
  • TTCCAAA
  • TTCCAAA
  • 2015年10月08日 22:21
  • 595

Android触摸事件分发机制详解

Android触摸事件分发机制详解

Android触摸事件分发机制

Android触摸事件分发机制 最近做了一个类似桌面应用图标可以点击,长按拖动效果,然后研究了下android触摸事件机制。 Android中的事件分为按键事件和触摸事件,这里...

浅谈Android 触摸事件分发机制

Touch触摸事件 在Android中Touch触摸事件主要包括点击(onClick)、长按(onLongClick)、拖拽(onDrag)、滑动(onScroll)等,点击又包括单击和双击,另外还包...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android触摸事件分发机制
举报原因:
原因补充:

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