客户端笔记——View事件分发机制

一.基础知识

1.事件分发

发生了一个Touch事件时,将MotionEvent在屏幕上找到一个具体的View处理之。

2.Touch事件

触摸事件,被分发的对象;
当用户触摸屏幕时(View 或 ViewGroup派生的控件),将产生点击Touch事件。

3.MotionEvent

Touch事件的操作(按下、滑动、抬起、取消),位置,时间等封装成一个MotionEvent对象。

事件类型具体动作
MotionEvent.ACTION_DOWN按下View(所有事件的开始)
MotionEvent.ACTION_UP抬起View(与DOWN对应)(事件序列的结束)
MotionEvent.ACTION_MOVE滑动View
MotionEvent.ACTION_CANCEL滑动超出控件边界时
4.事件序列

从手指接触屏幕(DOWN事件) 至 手指离开屏幕(UP/CANCEL事件),整个过程产生的一系列事件
在这里插入图片描述

5.事件分发的顺序

Activity -> ViewGroup -> View

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

6.事件分发的三个核心方法
  • dispatchTouchEvent() 事件的传递
  • onInterceptTouchEvent() 事件的拦截
  • onTouchEvent() 事件的处理

在这里插入图片描述

7.上述方法的返回值含义

dispatchTouchEvent():

  • True 本层中做消费事件,事件不再继续分发,事件分发结束。
  • False 这一层本次不消费事件,事件分发给child.dispatchTouchEvent()

onTouchEvent():

  • True 在本层中做消费事件,事件分发结束。
  • False 本层不消费事件,传给上一层(父控件)的onTouchEvent()做处理

onInterceptTouchEvent():

  • True 本层ViewGroup拦截此事件,传给本层ViewGroup的onTouchEvent()处理
  • False(默认) 本ViewGroup不拦截,事件继续分发,给child.dispatchTouchEvent()

二.详解

1.三大方法总述

在这里插入图片描述
以下三张神图讲清了源码中 Activity、ViewGroup、View 中事件分发流程。

2.Activity的事件分发流程

在这里插入图片描述

3.ViewGroup事件分发流程

在这里插入图片描述

4.View的事件分发流程

在这里插入图片描述

5.整个事件分发业务流程

在这里插入图片描述

 

三.我的一些理解

1.消费:就是在当前层处理了事件。

2.事件分发机制设计成两部分:事件的派发(dispatch)和事件的处理。派发时自上而下派发,处理时自下而上处理。 dispatch时可因为ViewGroup的拦截提前进入事件的处理环节。

3.可以重写以上三个方法 + onTouch(),修改其返回值(return true),实现对事件分发流程的控制。
对事件分发的拦截,可以重写OnInterceptTouchEvent()和onTouchEvent()。
如 想要在ViewGroup拦截事件,重写ViewGroup.OnInterceptTouchEvent()使其return true,再重写ViewGroup.onTouchEvent(),增加对事件的处理,最后return true。

4.onTouch()先于onTouchEvent()执行,onTouchEvent()中执行onClick()。所以:
- onTouch()执行高于onClick()
- 重写onTouch()使其return true表明事件已消费,不再走事件分发流程,自然也不会执行onTouchEvent()和其中的onClick()

5.一个事件序列中的所有事件 [1DOWN+nMOVE+1*UP] 都只被同一个View处理(消费)。

 

四.参考文章

必读:
Android事件分发机制详解:史上最全面、最易懂(神文,源码全解析)
Android校招面试指南-事件分发
选读:
Android事件分发机制详解(带demo)
面试:讲讲 Android 的事件分发机制
Android事件分发机制 详解攻略(带源码分析)
View的事件传递及分发机制(带源码分析)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值