「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
相关文章:
Android View的事件分发(一)-事件分发的过程
Android View的事件分发(二)-事件传递顺序
Android View的事件分发(三)-事件的分发(dispatchTouchEvent)
Android View的事件分发(四)-事件处理(onTouchEvent)
Android View的事件分发(五)-事件拦截(onInterceptTouchEvent)
前面介绍了事件的分发(dispatchTouchEvent)和事件的处理(onToucEvent),我们知道事件的分发是有上而下,越靠近屏幕,优先级越高,那么如果我们想跳过当前的,去处理下面一层的事件,需要怎么做呢?那么我们就需要对事件进行拦截, 让事件分发到下一层。
onInterceptTouchEvent
我们在创建视图或者说XML的时候,最外层的往往是在最下面,而在里面的在最上面,怎么说呢,用一张图来展现下吧:
图中 A 为根布局容器,B 是依赖于 A 的子布局容器,C 是 B 中的子 View,三者的位置关系是 A->B->C。 所以如果这个时候我们去触摸屏幕,那么事件的传递顺序是如何的呢,当在 ViewGroup 中存在多个 View 或 ViewGroup 叠加显示时,gesture 事件将会以自上而下的顺序来执行,即最靠近屏幕的 C 先执行 onTouchEvent 方法,然后依次向下传递。即 C->B->A。
上一篇文章说到,onTouchEvent是有返回值得,返回true表示事件消费了,就不会处理了,返回false则继续向下传递,那么上图中,B和C的onTouchEvent的事件都返回true,又想不让C消费,传递到B怎么办,这个时候就需要onInterceptTouchEvent方法。
通过该方法,我们可以在 onTouchEvent 方法被调用之前去拦截该手势事件,拦截后的事件会被分配到该 View 下的 onTouchEvent 方法中去处理。与 onTouchEvent 相反,该方法的手势事件传递过程是自下而上,同时在 gesture 事件序列中,所有的手势事件都可以通过 onInterceptTouchEvent 方法被拦截,这样对于手势的处理有更大的自由度,通过 onTouchEvent 和 onInterceptTouchEvent 结合使用,手势事件实现了先上后下的一个过程,我们可以通过特定的方法在某个点进行事件的处理。看下下面是处理视图:
总结
onInterceptTouchEvent()是用于处理事件(重点onInterceptTouchEvent这个事件是从父控件开始往子控件传的,直到有拦截 或者到没有这个事件的view,然后就往回从子到父控件,这次是onTouch的)(类似于预处理,当然也可以不处理)并改变事件的传递方向,
也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false,则把事件交给子控件的dispatchTouchEvent()