android触摸事件分发机制

342人阅读 评论(0) 收藏 举报
分类:

一、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应用层View触摸事件分发机制

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

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

本篇博文是Android触摸事件分发机制系列博文的第一篇,带领大家从全局掌握Android触摸事件分发机制。特别声明的是,本源码解读是基于最新的Android6.0版本。为什么要解读触摸事件分发机制1...
  • mynameishuangshuai
  • mynameishuangshuai
  • 2016-10-24 18:00:17
  • 8874

Android自定义控件系列九:从源码看Android触摸事件分发机制

Android触摸事件,网上也有很多文章来讲了,今天在这里想使用例子和源码相结合的方式,可能会看的更清晰一些。 对于dispatchTouchEvent和onInterceptTouc...
  • cyp331203
  • cyp331203
  • 2015-04-18 12:04:24
  • 4557

Android 触摸事件分发和拦截机制

Android 开发中,很多情况下,我们需要对触摸事件进行处理,但是当面对错综复杂的 Android 布局时,我们如何准确的将一个用户的触摸事件传递到对应的控件中并让它进行处理呢?首先,我们先假设这里...
  • Hacker_ZhiDian
  • Hacker_ZhiDian
  • 2017-03-21 21:57:52
  • 1274

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

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

触摸事件的分发机制

ViewGroup的事件分发机制View一般都包含在ViewGroup中,例如在actingity中触摸事件一般从window、activity、decorView、ViewGroup,最后才是被点击...
  • didiaodazhong
  • didiaodazhong
  • 2016-12-16 10:19:10
  • 133

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

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

触摸事件分发机制详解

1.触摸事件的相关方法: ViewGroup: •dispatchTouchEvent(MotionEvent) 用于分发touch事件 •onInterceptTouchEv...
  • huang_xiao_yu
  • huang_xiao_yu
  • 2015-10-30 23:19:50
  • 1351

触摸事件分发机制总结

从手指触摸到设备屏幕,直至手指离开设备屏幕,这个过程会不断的产生触摸事件,Framework称之为MotionEvent。 分发机制这是用于解决View的嵌套、重叠所产生的触摸事件应该由哪个view...
  • fyplant12
  • fyplant12
  • 2015-08-04 14:53:54
  • 679

Android触摸事件分发机制总结

Android事件分发 事件拦截总结
  • w804518214
  • w804518214
  • 2016-04-05 15:20:18
  • 657
    个人资料
    持之以恒
    等级:
    访问量: 8万+
    积分: 1821
    排名: 2万+
    最新评论