Android中跟Touch事件有关的事件有三个:
public boolean dispatchTouchEvent(MotionEvent ev):传递Touch事件至target view(可以是自己)。
public boolean onInterceptTouchEvent(MotionEventev):在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函数。
分享到:
相关推荐
从布局的角度来分析Touch事件,便于深刻的理解并编写出合理代码。
onInterceptTouchEvent和onTouchEvent调用时序详解 测试demo 详细介绍请移步:http://blog.csdn.net/yiranxinshou/article/details/9201833
android测试Touch事件DEMO
主要介绍了Android判断touch事件点是否在view范围内的方法,涉及Android事件响应与view属性操作的相关技巧,需要的朋友可以参考下
android之Touch事件处理机制测试, 滑动事件冲突解决,ViewGroup中事件触发和传递机制
android Touch事件传递机制的实例
Android Touch事件rawX,rawY与x,y的区别
Android Touch事件传递机制解析
Android深入研究Touch事件demo
Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup、View、Activity。...
详细了解可以查看链接:http://blog.csdn.net/hnulwt/article/details/45847737非常简单的测试小demo,有关于android事件分发机制的。
ForceTouch在Android中的简单实现
android touch事件及触屏简单的应用,记录触屏的轨迹。
测试过程自己重载了Testlinearlayout 继承自 linearLayout ,里面包含了一个重载的TestButton继承自Button
这个是自己在windows平台上利用cygwin编译的android soundtouch的一个例子。对于在android平台上学习声音处理是个很好的demo。
Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后。 Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层。 首先说一下Touch事件处理的几条基本规则。 如果在某个层级...
这是Qt for Android的测试工程,主要测试QT的触摸手势事件
关于onTouch上下移动的判断demo
本类主要描述了在ViewGroup中 点击事件 的 dispatch、onInterrupt、onTouch 这三者的关系以及生命周期