欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)

程序员文章站 2022-03-05 16:09:30
文章目录前言一、基本知识1. 事件分发的三个函数2.事件分发的对象3. 分发事件的组件二、事件分发机制场景1.不拦截、不消费2.拦截,但均无消费总结前言一、基本知识1. 事件分发的三个函数事件的分发 dispatchTouchEvent()事件的拦截 onInterceptTouchEvent()事件的处理(消费) onTouchEvent()2.事件分发的对象  被分发的对象是那些?被分发的对象是用户触摸屏幕而产生的点击事件,事件主要包括:按下、滑动、抬起与取消。这些事件被封装....


前言

一、基本知识

1. 事件分发的三个函数

  • 事件的分发 dispatchTouchEvent()
  • 事件的拦截 onInterceptTouchEvent()
  • 事件的处理(消费) onTouchEvent()

2.事件分发的对象

  被分发的对象是那些?被分发的对象是用户触摸屏幕而产生的点击事件,事件主要包括:按下、滑动、抬起与取消。这些事件被封装成MotionEvent对象。

  • MotionEvent.ACTION_DOWN 在屏幕按下时
  • MotionEvent.ACTION_MOVE 在屏幕上滑动时
  • MotionEvent.ACTION_UP 在屏幕抬起时
  • MotionEvent.ACTION_CANCLE 滑动超出控件边界时

3. 分发事件的组件

分发事件的组件,也称为分发事件者,包括Activity、View和ViewGroup。它们三者的一般结构为:
Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)

二、事件分发机制场景

如图场景下:最外层应该是一个Activity。
Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)

1.不拦截、不消费

当三个主体的任何函数的 返回值 都不做任何处理时,即不拦截、不消费:

Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)

  当触发ACTION_DOWN的时候,事件会经过
Activity——MyViewGroupA——MyViewGroupB——MyView
一层层的向下进行
dispatchTouchEvent(分发)—onInterceptTouchEvent(拦截)
调用。当到达最底层MyView后,开始触发消费操作,因为我均不消费,ACTION_DOWN将由底层一层层向上冒,移交上层处理。当抵达最上层Activity后,说明下层均不消费,之后触发的ACTION_MOVE和ACTION_UP将不再向下层分发传递,直接交由Activity分发给自己进行处理。

2.拦截,但均无消费

当在ViewGroup使onInterceptTouchEvent()返回true,即ViewGroup对事件进行拦截时

Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)

当触发ACTION_DOWN的时候,事件依然是从Activity开始一层层向下传递,当传递到MyViewGroupB时,因为进行了事件拦截,所以执行完onInterceptTouchEvent后不再向下传递,而是直接交由MyViewGroupB的onTouchEvent进行消费处理。由于我们是只拦截,不消费,所以事件向上传递,交由上层处理,最终回到Activity。之后触发的ACTION_MOVE和ACTION_UP也不再向下传递,直接交由Activity分发给自己处理。

3.ViewGoup消费,不拦截

当在ViewGroup使onTouchEvent()返回true,即ViewGroup对事件进行消费时:
Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)

当触发ACTION_DOWN的时候,事件的分发传递过程和1的时候一样,从Activity开始一层层向下传递,最终传递到最底层MyView,触发消费操作,然后MyView将消费操作移交上层处理,然后到达MyViewGroupB的onTouchEvent,并且进行了消费处理,事件处理到此不在向上移交。当触发ACTION_MOVE和ACTION_UP操作时,事件依然需要由Activity开始向下分发传递,但是当传递到MyViewGroupB后,由于其消费了ACTION_DOWN,事件将不再继续向下分发,而是直接由MyViewGroupB分发给自己的onTouchEvent进行继续处理。事件处理也不再向上移交。

注:

参考文章1

参考文章2

本文地址:https://blog.csdn.net/weixin_43918342/article/details/112596064

相关标签: android java