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的贴图麻烦。
求解决办法。
相关推荐
touch机制好好看了一下,呵呵。。android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:1)publicbooleandispatchTouchEvent(MotionEvent ev)这个方法用来分发TouchEvent2)...
本文将深入解析Android的Touch事件分发机制,并通过一个名为"EventDispatchTest"的示例来说明。 1. **事件分发流程** Android中的触摸事件分发分为三个阶段:`dispatchTouchEvent()`, `onInterceptTouchEvent()`, ...
本文将深入探讨Android事件传递机制,并结合提供的"TestTouch"测试代码进行解析。 Android事件传递机制主要围绕着触摸事件(MotionEvent)展开,当用户在屏幕上进行点击、滑动等操作时,这些动作会转化为一系列的...
本Demo主要展示了Android的Touch事件分发机制,包括事件的传递顺序、处理流程以及如何自定义控件来拦截或消费事件。下面将详细解析这些知识点。 1. **事件流**: Android的Touch事件流分为三个阶段:**ACTION_DOWN...
通过上述分析可以看出,Android的触摸事件分发机制非常灵活且强大,能够根据实际需求在不同的视图之间传递事件。关键在于 `ViewGroup` 的 `onInterceptTouchEvent` 方法和 `View` 的 `onTouchEvent` 方法的选择性...
Android Input 事件获取机制 Android 操作系统中,input 事件是指用户与设备交互...本文详细介绍了 Input System 的启动流程、事件简介、事件读取流程等内容,希望能够帮助读者更好地理解 Android 的 Input 事件机制。
本文将详细解析Android事件分发机制的第三部分:事件分发和消费,帮助开发者深入理解这一关键过程。 事件分发主要包括两个阶段:事件传播和事件消费。当用户在屏幕上进行触摸操作时,Android会生成一个MotionEvent...
本篇将深入解析“android Touch触发事件的生命周期”,着重讨论ViewGroup中点击事件的`dispatchTouchEvent()`, `onInterceptTouchEvent()`, 和`onTouchEvent()`这三个关键方法之间的关系及其工作流程。 首先,我们...
4. **与Android Media框架集成**:在Android应用中,通常需要将处理后的音频数据传递给`AudioTrack`或`MediaPlayer`进行播放。 **四、学习与实践** 1. **调试与优化**:开发者可以通过日志输出来检查处理过程中的...
本文将深入探讨Android Touch系统的工作原理,包括触摸事件的产生、传递和处理流程,以及关键类和方法的解析。 1. 触摸事件的生命周期 当用户在屏幕上触摸时,事件首先由硬件层的触控传感器捕捉,然后转换为...
在Android系统中,触摸事件(Touch Event)是用户与设备交互的重要方式,它涉及一系列复杂的分发机制。本文将深入解析Android Touch事件的分发过程,帮助开发者更好地理解和设计应用程序。 1. 触摸事件的生命周期 ...
本文将深入解析Android中的触摸事件分发机制,帮助开发者理解并更好地处理用户输入。 一、事件序列 当用户在屏幕上进行点击或滑动操作时,会产生一系列的MotionEvent。这些事件按照顺序分为ACTION_DOWN、ACTION_...
### Android O 多屏Touch方案解析 随着移动设备技术的发展,多屏显示逐渐成为一种新的交互方式,特别是在汽车信息系统中,这种技术的应用越来越广泛。在Android O系统中,实现了一个多屏Touch方案,并且已经在实际...
这份资料深入解析了 Android 的触控系统,包括事件分发、触摸事件处理以及如何优化用户体验。下面将详细阐述其中的关键知识点。 一、Android 触控系统基础 Android 触控系统是移动应用开发中的核心部分,它负责处理...
在Android开发中,触摸事件(Touch Event)是用户与设备交互的重要方式,它涉及到一系列复杂的事件分发机制。本文将详细解析`android touchevent`的相关知识点,通过一个实际的Demo来阐述`ontouchevent`事件处理以及...
`TouchEventSample`是一个典型的Android项目,它详细展示了如何处理和解析Android系统的触摸事件。该项目主要关注Java语言,因为这是Android开发的主要编程语言。 在Android中,触摸事件通过MotionEvent类进行传递...