Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)
文章目录
前言
一、基本知识
1. 事件分发的三个函数
- 事件的分发 dispatchTouchEvent()
- 事件的拦截 onInterceptTouchEvent()
- 事件的处理(消费) onTouchEvent()
2.事件分发的对象
被分发的对象是那些?被分发的对象是用户触摸屏幕而产生的点击事件,事件主要包括:按下、滑动、抬起与取消。这些事件被封装成MotionEvent对象。
- MotionEvent.ACTION_DOWN 在屏幕按下时
- MotionEvent.ACTION_MOVE 在屏幕上滑动时
- MotionEvent.ACTION_UP 在屏幕抬起时
- MotionEvent.ACTION_CANCLE 滑动超出控件边界时
3. 分发事件的组件
分发事件的组件,也称为分发事件者,包括Activity、View和ViewGroup。它们三者的一般结构为:
二、事件分发机制场景
如图场景下:最外层应该是一个Activity。
1.不拦截、不消费
当三个主体的任何函数的 返回值 都不做任何处理时,即不拦截、不消费:
当触发ACTION_DOWN的时候,事件会经过
Activity——MyViewGroupA——MyViewGroupB——MyView
一层层的向下进行
dispatchTouchEvent(分发)—onInterceptTouchEvent(拦截)
调用。当到达最底层MyView后,开始触发消费操作,因为我均不消费,ACTION_DOWN将由底层一层层向上冒,移交上层处理。当抵达最上层Activity后,说明下层均不消费,之后触发的ACTION_MOVE和ACTION_UP将不再向下层分发传递,直接交由Activity分发给自己进行处理。
2.拦截,但均无消费
当在ViewGroup使onInterceptTouchEvent()返回true,即ViewGroup对事件进行拦截时
当触发ACTION_DOWN的时候,事件依然是从Activity开始一层层向下传递,当传递到MyViewGroupB时,因为进行了事件拦截,所以执行完onInterceptTouchEvent后不再向下传递,而是直接交由MyViewGroupB的onTouchEvent进行消费处理。由于我们是只拦截,不消费,所以事件向上传递,交由上层处理,最终回到Activity。之后触发的ACTION_MOVE和ACTION_UP也不再向下传递,直接交由Activity分发给自己处理。
3.ViewGoup消费,不拦截
当在ViewGroup使onTouchEvent()返回true,即ViewGroup对事件进行消费时:
当触发ACTION_DOWN的时候,事件的分发传递过程和1的时候一样,从Activity开始一层层向下传递,最终传递到最底层MyView,触发消费操作,然后MyView将消费操作移交上层处理,然后到达MyViewGroupB的onTouchEvent,并且进行了消费处理,事件处理到此不在向上移交。当触发ACTION_MOVE和ACTION_UP操作时,事件依然需要由Activity开始向下分发传递,但是当传递到MyViewGroupB后,由于其消费了ACTION_DOWN,事件将不再继续向下分发,而是直接由MyViewGroupB分发给自己的onTouchEvent进行继续处理。事件处理也不再向上移交。
注:
本文地址:https://blog.csdn.net/weixin_43918342/article/details/112596064
推荐阅读
-
Android 深入探究自定义view之事件的分发机制与处理详解
-
Android开发知识(九):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(下)
-
Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(上)
-
Android开发知识(八):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(中)
-
Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(下)
-
Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(中)
-
Android 深入探究自定义view之事件的分发机制与处理详解
-
Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)