`

Android Touch事件

 
阅读更多
Android中跟Touch事件有关的事件有三个:
    public boolean dispatchTouchEvent(MotionEvent ev):传递Touch事件至target view(可以是自己)。
    public boolean onInterceptTouchEvent(MotionEvent ev):在ViewGroup中定义,用于拦截Touch事件的传递。
    public boolean onTouchEvent(MotionEvent event): Touch事件处理函数。



  先说下事件传递的两种方式:
    隧道方式:从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。
    冒泡方式:从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。



  Touch事件通过dispatchTouchEvent以隧道方式从上往下传递。如果在一个View中执行onTouchEvent时返回true的话,接下来的事件(ACTION_DOWN后的ACTION_UP,及可能在中间包含的若干个ACTION_MOVE,从ACTION_DOWN至ACTION_UP为一个连续事件,这是自己想的,不知道准确否)仍会传递到这个View的onTouchEvent,如果返回false的话,接下来的事件就不会再传递到这个View,而是执行其Parent View的onTouchEvent,每当一个View的onTouchEvent事件返回false,接下来的事件(如果还有的话)就会止步于这个View的Parent View,每次上升一个层次,类似于冒泡方式。



  Touch事件传递过程中经过的元素都是一个View,但是事件处理的最外层的元素却不是View,除下跟Window有关的事件,当一个Touch事件发生的时候,会首先调用当前Activity的dispatchTouchEvent函数,然后才将事件传递至下层的View元素。当dispatchTouchEvent经过一个View往下传递的时候,如果这个View是一个ViewGroup,会调用其onInterceptTouchEvent函数,这个函数表示是否拦截Touch事件,如果这个函数返回true,表示这个ViewGroup拦截了事件的传递,Touch事件不会再往下传递给它的子View,而是由它处理,所以会调用它的onTouchEvent函数,如果在传递的过程中没有ViewGroup拦截事件,即经过的所有ViewGroup都返回false,那么事件最终会传递至最内层的View,一般是一个Widget,当然也可以是一ViewGroup(其内部不包含任何元素),如果最后事件传递到一View(非ViewGroup),那么会首先调用这个View的onTouchListener(如果设置了的话),如果onTouchListener返回false则继续调用View的onTouchEvent(默认返回true),如果最后事件传递到一ViewGroup(无子View),会调用它的onTouchEvent函数,默认返回false。


  如果调用一个View的onTouchEvent函数时返回true的话,那么接下来的Touch Event事件(ACTION_DOWN后的ACTION_UP,及可能在中间包含的若干个ACTION_MOVE,从ACTION_DOWN至ACTION_UP为一个连续事件,这是自己想的,不知道准确否)仍会传递到这个View并调用它的onTouchEvent函数,在onTouchEvent函数中可以根据条件返回不同的值,如果某一次在此函数中返回了false那么接下来的Touch Event事件就不会再传递到这个View,而会在其Parent View终止,调用其Parent View的onTouchEvent。如果所有的View都的onTouchEvent函数都返回false,那么接下来的Touch Event事件会由Activity处理,即调用Activity的onTouchEvent函数。



  当调用ViewGroup的dispatchTouchEvent函数时,会首先调用onInterceptTouchEvent函数判断有没有拦截事件,如果没有拦截(返回false),则会依次调用这个ViewGroup的所有子View的dispatchTouchEvent函数。比如一个FrameLayout上层叠了三个ViewGroup,那么在这个FrameLayout的dispatchTouchEvent中会依次调用这三个ViewGroup的dispatchTouchEvent函数,而在这三个ViewGroup的dispatchTouchEvent中也会依次调用他们的子View的dispatchTouchEvent函数,直到其中一个View的dispatchTouchEvent返回true,表示已经处理了这个Touch事件,不需要再调用这个View的Slibling Views。比如调用这三个层叠的ViewGroup的dispatchTouchEvent函数时,如果第一个ViewGroup的dispatchTouchEvent函数就返回了true(已经消耗掉了这个事件),那么其他两个ViewGroup的dispatchTouchEvent就不会再被调用。可以自定义一个ViewGroup的子类并重载他的dispatchTouchEvent函数,使其处理过Touch事件后仍返回false,那么就还会调用其他兄弟View的dispatchTouchEvent函数。
分享到:
评论

相关推荐

    Android Touch事件rawX,rawY与x,y的区别

    本文将深入探讨Android Touch事件中`rawX`、`rawY`与`x`、`y`的区别,帮助开发者更好地理解和处理触摸事件。 首先,`MotionEvent`是Android系统用于表示触摸事件的数据类,它包含了与触摸屏幕相关的各种信息,如...

    Android Touch事件传递机制解析

    本文将深入解析Android的Touch事件传递机制,并结合源码进行详细阐述。 首先,Android的触摸事件主要包括ACTION_DOWN、ACTION_UP、ACTION_MOVE、ACTION_CANCEL和ACTION_POINTER_DOWN/UP等几种类型。当用户触摸屏幕...

    Android Touch事件分发机制代码一

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

    android之Touch事件处理机制测试

    本文将深入探讨“android之Touch事件处理机制测试”,包括滑动事件冲突的解决、ViewGroup中的事件触发和传递机制。 一、Android Touch事件处理机制 1. 触摸事件流程:在Android中,触摸事件分为三个阶段,即ACTION...

    android touch事件及触屏简单的应用

    在"android touch事件及触屏简单的应用"这个场景中,我们通常会创建一个自定义的View类,比如叫做TouchPaintView,继承自View。在这个类中,我们需要重写onTouchEvent()方法,对ACTION_DOWN、ACTION_MOVE和ACTION_UP...

    android Touch事件传递机制

    在Android系统中,触摸事件(Touch Events)是用户与设备交互的主要方式,它涉及到了复杂的事件传递机制。本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解...

    android touch事件解析

    测试过程自己重载了Testlinearlayout 继承自 linearLayout ,里面包含了一个重载的TestButton继承自Button

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

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup、View、Activity。...

    30分钟搞清楚Android Touch事件分发机制

    Android Touch事件分发机制是Android用户界面交互的关键部分,它决定了触摸事件如何在视图层次结构中被处理。在这个机制中,主要涉及两个关键角色:`ViewGroup`和`View`。 `ViewGroup`作为容器,它管理着一系列的`...

    android测试Touch事件DEMO

    总结来说,"android测试Touch事件DEMO"是一个用于教学和实践的实例,它涵盖了Android中触摸事件的基本处理、事件分发以及自定义日志记录,对于理解和掌握Android触摸事件机制非常有帮助。通过这个DEMO,开发者可以...

    AndroidTouch事件传递机制解析

    开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把android touch机制好好看了一下,呵呵。。android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:1...

    Android Touch事件分发深入了解

    【Android Touch事件分发】 Android Touch事件分发是Android用户界面交互的核心机制之一,它确保了用户在触摸屏幕时,事件能够正确地被相应的View处理。深入理解这一机制对于优化用户体验和开发复杂的交互功能至关...

    android Touch触发事件的生命周期

    总的来说,理解Android Touch事件的生命周期是开发高效、响应式的Android应用的基础。熟练运用`dispatchTouchEvent()`, `onInterceptTouchEvent()`, 和`onTouchEvent()`可以帮助我们精确控制触摸事件的处理,为用户...

    Android中Touch事件的传递

    Android中的Touch事件传递是一个涉及多个组件和层次的过程。为了深刻理解这一过程,我们首先需要了解Activity界面的布局结构,然后深入到事件的传递与处理流程中,最后通过流程图来展示整个事件的传递顺序。 在...

    Android Touch事件分发过程详解

    本文将深入解析Android Touch事件的分发过程,帮助开发者更好地理解和设计应用程序。 1. 触摸事件的生命周期 触摸事件的生命周期包括ACTION_DOWN、ACTION_MOVE、ACTION_UP和ACTION_CANCEL等几个关键动作。ACTION_...

    Android判断touch事件点是否在view范围内的方法

    在Android应用开发中,处理触摸事件(touch event)是至关重要的,因为它允许用户与界面进行交互。本篇文章将深入探讨如何判断一个触摸事件点是否在指定的View范围内,以及涉及的相关事件响应和View属性操作。 首先...

    Android-touch-event.rar_android touch_android 翻页_event

    一、Android Touch事件体系 Android的触摸事件处理主要通过MotionEvent类来完成。MotionEvent封装了触摸屏幕时的各种动作,如ACTION_DOWN(手指按下)、ACTION_UP(手指抬起)、ACTION_MOVE(手指在屏幕上移动)等...

    Android深入研究Touch事件demo

    在Android开发中,触摸事件(Touch Event)是用户与设备交互的重要部分,它涉及到Activity、View及ViewGroup之间复杂的事件分发机制。本篇将深入探讨Android中的触摸事件处理,包括事件的产生、分发、拦截以及如何...

Global site tag (gtag.js) - Google Analytics