ViewGroup的onInterceptTouchEvent 顾名思义,作用是拦截TouchEvent。
假如有以下布局
在一组TouchEvent中可能出现:
没有View或ViewGroup消费ACTION_DOWN事件,则TouchEvent的传递路径会是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ChildView.onTouchEvent —> ViewGroup2.onTouchEvent —> ViewGroup1.onTouchEvent
由于谁都没有消费ACTION_DOWN事件,后续的MOVE,UP事件将不会传进来。
ViewGroup2拦截且消费了ACTION_DOWN事件,则TouchEvent的传递路径会是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
也即后续的TouchEvent都传递给了ViewGroup2。
ViewGroup2拦截了ACTION_DOWN事件但不消费,而ViewGroup1消费了该TouchEvent,则TouchEvent的传递路径会是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ViewGroup2.onTouchEvent —> ViewGroup1.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onTouchEvent ;
也即后续的TouchEvent都传递给了ViewGroup1。
ChildView先消费了ACTION_DOWN事件,然后满足一定条件时ViewGroup2拦截了TouchEvent,此时无论ViewGroup2是否消费该TouchEvent,TouchEvent的传递路径是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ChildView.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ChildView.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent && ACTION_CANCEL : ChildView.onTouchEvent ; (满足条件触发ViewGroup2拦截,会传递ACTION_CANCEL给ChildView)
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
也即后续的TouchEvent都传递给了ViewGroup2的onTouchEvent,且无论ViewGroup2是否消费该TouchEvent 。
相关推荐
当触摸事件发生时,事件首先传递到`ViewGroup`,`ViewGroup`有机会拦截这个事件,如果选择不拦截,则事件会继续传递给子`View`。`ViewGroup`可以通过重写`onInterceptTouchEvent()`来决定是否拦截事件。 3. **事件...
在Android的触摸事件处理中,事件会从父视图传递到子视图,如果父视图想要处理这些事件,就需要在`onInterceptTouchEvent()`中返回`true`,表示拦截事件,否则返回`false`让事件继续传递。在这个场景下,我们需要在...
事件分发涉及到MotionEvent的生命周期以及ViewGroup如何决定事件传递的方向。 MotionEvent是Android中表示触控事件的对象,包含了ACTION_DOWN(手指按下)、ACTION_MOVE(手指移动)和ACTION_UP(手指抬起)等主要...
`onInterceptTouchEvent()`是ViewGroup的方法,允许 ViewGroup 在事件传递到其子View之前截获事件。如果返回true,事件会被ViewGroup消耗,不再传递给子View。而`requestDisallowInterceptTouchEvent()`是View的...
如果ViewGroup的onInterceptTouchEvent()返回true,则表示该ViewGroup拦截了事件,事件进入目标阶段;如果返回false,则事件会继续向下传递。 2. 目标阶段:事件传递到能完全覆盖触摸点的最小视图,即事件的目标...
- **ViewGroup.dispatchTouchEvent()**:当事件传递到ViewGroup时,它同样会调用`dispatchTouchEvent()`方法。 - 如果返回`super.dispatchTouchEvent()`,事件将继续传递给子View。 - 如果返回`true`或`false`,事件...
2. **事件传递**:如果ViewGroup不拦截(即`onInterceptTouchEvent()`返回false),事件会沿着布局树向下传递到直接子视图。如果子视图消费了事件(`onTouchEvent()`返回true),事件流停止;否则,事件会回溯到父...
事件分发机制是Android用户界面(UI)系统的重要组成部分,它决定了触摸事件如何在View和ViewGroup之间传递。本Demo实验代码主要关注ViewGroup的事件分发过程,帮助开发者理解这一核心概念。 首先,我们来看事件...
2. 如果`onInterceptTouchEvent`返回`true`,那么事件会被ViewGroup消费,不再传递给子View,后续的同批次事件(ACTION_DOWN、ACTION_MOVE等)也会直接传递给ViewGroup。 3. 如果`onInterceptTouchEvent`返回`false`...
- **onInterceptTouchEvent()**: ViewGroup可以拦截子View的事件。默认情况下,ViewGroup不拦截,但可以通过重写此方法实现拦截。如果返回true,表示父View截取了事件,事件不会到达子View。 - **onTouchEvent()**...
2. 拦截事件:通过重写ViewGroup的onInterceptTouchEvent(),可以改变默认行为,让父View拦截并处理事件,而不再将事件传递给子View。 3. 事件消耗:在onTouchEvent()中,通常需要根据ACTION_DOWN、ACTION_UP等事件...
`onInterceptTouchEvent`方法在ViewGroup中定义,它的主要作用是拦截事件流,即决定事件是否由父视图处理,还是继续传递给子视图。当一个触摸事件发生时,系统首先会调用父视图的`onInterceptTouchEvent`。如果返回`...
- 如果ViewGroup不拦截事件,事件会传递给子View,按照Z轴顺序(先添加的View在下,后添加的在上)进行。 - ViewGroup可以拦截并处理事件,或者让事件继续传递给子View。 - 如果一个View既不处理事件也不拦截,...
下面将详细阐述Android中的事件传递机制以及在“ViewsDemo”项目中可能涉及的相关知识点。 1. 触摸事件概述 Android系统通过MotionEvent类来表示用户的触摸行为,如按下、移动和释放等。这些事件由系统按照一定的...
同时,还可以利用ViewGroup的`onInterceptTouchEvent()`方法进行拦截,使得事件在到达子View之前就被父View处理。 总的来说,理解Android的Touch事件传递机制对于开发者来说非常重要,它可以帮助我们更好地控制用户...
如果在某个父View中`onInterceptTouchEvent`返回`true`,则表示该父View想要拦截并处理这个事件,后续的触摸事件将不再传递给子View。默认情况下,`onInterceptTouchEvent`返回`false`,表示不拦截事件,事件将继续...
- `dispatchTouchEvent(MotionEvent event)`:ViewGroup(父View)会调用此方法来分发事件。它先调用`onInterceptTouchEvent()`判断是否拦截,然后根据结果决定是调用子View的`dispatchTouchEvent()`还是自身的`...
本示例代码“android事件传递机制demo代码”着重于ViewGroup的事件处理流程,通过`testTouchEvent`这个文件,我们可以深入理解Android中的触摸事件(TouchEvent)如何在组件层次间传递。 Android事件传递主要分为三...