用户登录
用户注册

分享至

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

  • 作者: 骚年应该有内涵
  • 来源: 51数据库
  • 2021-07-10

文章目录

  • 前言
  • 一、基本知识
    • 1. 事件分发的三个函数
    • 2.事件分发的对象
    • 3. 分发事件的组件
  • 二、事件分发机制场景
    • 1.不拦截、不消费
    • 2.拦截,但均无消费
    • 3.ViewGoup消费,不拦截
  • 注:


前言

一、基本知识

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进行继续处理。事件处理也不再向上移交。

注:

参考文章1

参考文章2

软件
前端设计
程序设计
Java相关