`

Android Touch事件传递机制解析

阅读更多

Android Touch事件传递机制解析

android系统中的每个 View 的子类都具有下面三个和 TouchEvent 处理密切相关的方法:

1 public boolean dispatchTouchEvent(MotionEvent ev)   这个方法用来分发 TouchEvent

2 public boolean onInterceptTouchEvent(MotionEvent ev)  这个方法用来拦截 TouchEvent

3 public boolean onTouchEvent(MotionEvent ev)  这个方法用来处理 TouchEvent

 

 

测试程序界面

 

下述3 Layout 包含关系见如下界面图。

 

状态1 :由 center 处理 Touch 事件

Xml如下:

<? xml   version = "1.0"   encoding = "utf-8" ?>

< LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"

     android:layout_width = "fill_parent"

     android:layout_height = "fill_parent"

     android:orientation = "vertical"   >

     < dk.touch.MyLayout

         android:id = "@+id/out"

         android:layout_width = "fill_parent"

         android:layout_height = "fill_parent"

         android:gravity = "center"

             android:background = "#ff345600"

          >

         < dk.touch.MyLayout

             android:id = "@+id/middle"

             android:layout_width = "200dp"

             android:layout_height = "200dp"

             android:gravity = "center"

             android:background = "#ff885678"

             >

             < dk.touch.MyLayout

                 android:id = "@+id/center"

                 android:layout_width = "50dp"

                 android:layout_height = "50dp"

                 android:background = "#ff345678"

                 android:focusable = "true"

                 android:focusableInTouchMode = "true"

                 android:clickable = "true"

                  >

             </ dk.touch.MyLayout >

         </ dk.touch.MyLayout >

     </ dk.touch.MyLayout >

</ LinearLayout >

 

 

注意:只有center这个部分是会处理/消费 Touch事件。

 

 

事件传递记录结果如上图。

由于Down Move Up 事件处理流程略微不同,故分开分析。

 

 

ACTION_DOWN事件处理流程:

 

首先触摸事件发生时( ACTION_DOWN ),由系统调用 Activity dispatchTouchEvent 方法,分发该事件。根据触摸事件的坐标,将此事件传递给 out dispatchTouchEvent 处理 ,out 则调用 onInterceptTouchEvent  判断事件是由自己处理,还是继续分发给子 View 。此处由于 out 不处理 Touch 事件,故根据事件发生坐标,将事件传递给 out 的直接子 View (即 middle )。

Middle Center 中事件处理过程同上。但是由于 Center 组件是 clickable   表示其能处理Touch 事件,故 center 中的 onInterceptTouchEvent 方法将事件传递给 center 自己的 onTouchEvent 方法处理。至此,此 Touch 事件已被处理,不继续进行传递。

Move和  up  事件处理流程类似,但是再 center 内的 dispatchTouchEvent 方法内被直接分配给 onTouchEvent 处理,不需经过 onInterceptTouchEvent 判断。这是由于, android 系统中将 1 down 事件、 n move 事件、 1 up 事件整体作为一次逻辑上的触控操作, Down 事件已经确定了处理事件的对象,则后续的 move up 事件也确定了处理事件的对象。

 

状态2 :都不处理事件

Xml如下:

<? xml   version = "1.0"   encoding = "utf-8" ?>

< LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"

     android:layout_width = "fill_parent"

     android:layout_height = "fill_parent"

     android:orientation = "vertical"   >

     < dk.touch.MyLayout

         android:id = "@+id/out"

         android:layout_width = "fill_parent"

         android:layout_height = "fill_parent"

         android:gravity = "center"

             android:background = "#ff345600"

          >

         < dk.touch.MyLayout

             android:id = "@+id/middle"

             android:layout_width = "200dp"

             android:layout_height = "200dp"

             android:gravity = "center"

             android:background = "#ff885678"

             >

             < dk.touch.MyLayout

                 android:id = "@+id/center"

                 android:layout_width = "50dp"

                 android:layout_height = "50dp"

                 android:background = "#ff345678"

                  >

             </ dk.touch.MyLayout >

         </ dk.touch.MyLayout >

     </ dk.touch.MyLayout >

</ LinearLayout >

 

 

 

 

 

 

轻触 center部分 logcat 输出结果

 

Action_down事件处理流程:

 

 

事件处理流程大致同上,区别是此状态下,所有组件都不会处理事件,事件并不会被center onTouchEvent 方法“消费”,则事件会层层逆向传递回到 Activity ,若 Activity 也不对此事件进行处理,此事件相当于消失了(无效果)。

 

对于后续的move up 事件,由于第一个 down 事件已经确定由 Activity 处理事件,故 up 事有由 Activity dispatchTouchEvent 直接分发给自己的 onTouchEvent 方法处理。

 


图片参见 : http://blog.sina.com.cn/s/blog_a0dfaa980100wn1w.html



源代码见附件。

 

 

 

PS.

新浪的不好传附件。

ITEYE的贴图麻烦。

求解决办法。

 

分享到:
评论

相关推荐

    AndroidTouch事件传递机制解析

    touch机制好好看了一下,呵呵。。android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:1)publicbooleandispatchTouchEvent(MotionEvent ev)这个方法用来分发TouchEvent2)...

    Android Touch事件分发机制代码一

    本文将深入解析Android的Touch事件分发机制,并通过一个名为"EventDispatchTest"的示例来说明。 1. **事件分发流程** Android中的触摸事件分发分为三个阶段:`dispatchTouchEvent()`, `onInterceptTouchEvent()`, ...

    Android事件传递机制测试代码

    本文将深入探讨Android事件传递机制,并结合提供的"TestTouch"测试代码进行解析。 Android事件传递机制主要围绕着触摸事件(MotionEvent)展开,当用户在屏幕上进行点击、滑动等操作时,这些动作会转化为一系列的...

    Touch事件分发机制

    本Demo主要展示了Android的Touch事件分发机制,包括事件的传递顺序、处理流程以及如何自定义控件来拦截或消费事件。下面将详细解析这些知识点。 1. **事件流**: Android的Touch事件流分为三个阶段:**ACTION_DOWN...

    android事件分发机制

    通过上述分析可以看出,Android的触摸事件分发机制非常灵活且强大,能够根据实际需求在不同的视图之间传递事件。关键在于 `ViewGroup` 的 `onInterceptTouchEvent` 方法和 `View` 的 `onTouchEvent` 方法的选择性...

    android input 事件的获取

    Android Input 事件获取机制 Android 操作系统中,input 事件是指用户与设备交互...本文详细介绍了 Input System 的启动流程、事件简介、事件读取流程等内容,希望能够帮助读者更好地理解 Android 的 Input 事件机制。

    Android事件分发机制(三)事件分发和消费

    本文将详细解析Android事件分发机制的第三部分:事件分发和消费,帮助开发者深入理解这一关键过程。 事件分发主要包括两个阶段:事件传播和事件消费。当用户在屏幕上进行触摸操作时,Android会生成一个MotionEvent...

    android Touch触发事件的生命周期

    本篇将深入解析“android Touch触发事件的生命周期”,着重讨论ViewGroup中点击事件的`dispatchTouchEvent()`, `onInterceptTouchEvent()`, 和`onTouchEvent()`这三个关键方法之间的关系及其工作流程。 首先,我们...

    android soundtouch demo

    4. **与Android Media框架集成**:在Android应用中,通常需要将处理后的音频数据传递给`AudioTrack`或`MediaPlayer`进行播放。 **四、学习与实践** 1. **调试与优化**:开发者可以通过日志输出来检查处理过程中的...

    android touch源码

    本文将深入探讨Android Touch系统的工作原理,包括触摸事件的产生、传递和处理流程,以及关键类和方法的解析。 1. 触摸事件的生命周期 当用户在屏幕上触摸时,事件首先由硬件层的触控传感器捕捉,然后转换为...

    Android Touch事件分发过程详解

    在Android系统中,触摸事件(Touch Event)是用户与设备交互的重要方式,它涉及一系列复杂的分发机制。本文将深入解析Android Touch事件的分发过程,帮助开发者更好地理解和设计应用程序。 1. 触摸事件的生命周期 ...

    Touch事件分发

    本文将深入解析Android中的触摸事件分发机制,帮助开发者理解并更好地处理用户输入。 一、事件序列 当用户在屏幕上进行点击或滑动操作时,会产生一系列的MotionEvent。这些事件按照顺序分为ACTION_DOWN、ACTION_...

    Android O 多屏Touch方案

    ### Android O 多屏Touch方案解析 随着移动设备技术的发展,多屏显示逐渐成为一种新的交互方式,特别是在汽车信息系统中,这种技术的应用越来越广泛。在Android O系统中,实现了一个多屏Touch方案,并且已经在实际...

    Mastering the Android Touch System - Daves Slides.pdf

    这份资料深入解析了 Android 的触控系统,包括事件分发、触摸事件处理以及如何优化用户体验。下面将详细阐述其中的关键知识点。 一、Android 触控系统基础 Android 触控系统是移动应用开发中的核心部分,它负责处理...

    android touchevent 例子 Demo

    在Android开发中,触摸事件(Touch Event)是用户与设备交互的重要方式,它涉及到一系列复杂的事件分发机制。本文将详细解析`android touchevent`的相关知识点,通过一个实际的Demo来阐述`ontouchevent`事件处理以及...

    TouchEventSample:Android Touch事件示例

    `TouchEventSample`是一个典型的Android项目,它详细展示了如何处理和解析Android系统的触摸事件。该项目主要关注Java语言,因为这是Android开发的主要编程语言。 在Android中,触摸事件通过MotionEvent类进行传递...

Global site tag (gtag.js) - Google Analytics