Android的Touch事件分发理论逻辑讲解

本文详细解析了Android的Touch事件分发机制,从Activity、Context到View的层次结构,再到MotionEvent对象的详细说明,包括事件坐标、类型、多点触摸等功能。通过图解展示了事件分发流程,包括ACTION_DOWN、ACTION_UP等关键步骤,帮助读者深入理解Android界面展示和事件处理。

备注:本文主要是对安卓整个Touch事件理论的讲解,主要用于更快了解系统是如何实现这一切事件的分发

在了解安卓的事件分发之前,我们先看如下图表(1-1),安卓的事件分发基于下图进行,以下会对每个类一一介绍

                                                图1-1

Activity:主要是封装视图(View)和上下文(Context),组成我们需要的Activity组件,通过继承该类实现我们需要的功能

ContextThemeWrapper:在ContextWrapper的基础之上增加了一些Theme的相关的内容,即android:theme属性指定的

ContextWrapper:该类只是对Context类的一种包装,该类的构造函数包含了一个真正的Context引用,即ContextIml

ContextIml:该类实现了Context类的功能

Context:上下文,我们可以根据它获取应、用程序的资源和相关的类

PhoneWindow:Window的唯一实现类,视图的展现,触摸等交互

Window:封装了Windown对视图的一些接口,例如增删改,绘制的一些流程等

DecorView:DecorView是窗口最顶层的视图,窗口视图处理相关的类

FrameLayout:系统封装的一种布局

ViewGroup:暂不介绍

View:暂不介绍

Android View 的绘制流程如下图( 1-2)

                                         图1-2

上述为我们整个Activity的关系图表,了解上述有利于接下来我们的讲解,接下来我们将会讲解事件的分发:

事件的分发机制就是点击事件的分发,事件的分发机制主要有:1:手指刚接触屏幕2:手指在屏幕上滑动3:手指松开的一瞬间(其实还有其它的,例如多指,划出屏幕等),然而一个完整的事件是指:手指触摸屏幕到手指松开这整的一个过程,我们安卓代码中,MotionEvent就是封装的这个事件,触摸事件的分发其实也就是MotionEvent对象的分发传递过程

 

下面我们来对MotionEvent类做一个简单的讲解

每个触摸事件在屏幕上都是一个动作,每个动作必定会有位置,然而MotionEvent就封装了一系列和位置相关的函数。

  1. 事件坐标:举例:getX(),getY,getRawX(),getRawY()
  2. 事件类型:举例:ACTION_DOWN,ACTION_UP等
  3. 多点触摸:举例:ACTION_POINTER_DOWN,ACTION_POINTER_UP等
  4. 获取历史的MOVE事件:举例:MotionEvent类中方法有History的相关方法
  5. 获取压力(接触面积大小):举例:getSize(),getPressure()等
  6. 鼠标事件:举例:鼠标事件和手指事件处理流程大致相同,感兴趣可以google或百度
  7. 输入设备类型判断:举例:
    1. TOOL_TYPE_ERASER:橡皮擦
    2. TOOL_TYPE_FINGER:手指
    3. TOOL_TYPE_MOUSE:鼠标
    4. TOOL_TYPE_STYLUS:手写笔
    5. TOOL_TYPE_UNKNOWN:未知

以上为MotionEvent类大致封装内容,这个类还有两个内部类,分别为PointerCoords和PointerProperties,是对事件用到的一些属性和类别的封装,感兴趣的同学可以看看源码

 

接下来进入我们的主题,Touch事件分发,首先我们先看一张图,图1-3

                                                   图1-3

结合图1-1,1-2,应该对系统是如何展示界面有一个基本认识,图1-3是对我们本事件分发的做了一个流程的展示,接下来对这三个方法做讲解

dispatchTouchEvent()用来进行事件分发,给对应的子View消费,在onTouchEvent()去实现
onInterceptTouchEvent()用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中不会再访问该方法
onTouchEvent()返回结果表示是否消费当前事件,如果不消费,返回false,同一个事件序列中,view不会再次接收到事件。。

 

 


 

 

总结:本文分为三个部分,第一部分是对系统的整个视图的展示做一个介绍,每个类的作用,第二部分是在事件分发中,我们的MotionEvent对象的讲解以及一些基本知识,最后一部分是在系统有了基本的认识之后,事件的具体分发做一个讲解

本文只是对理论知识的一些讲解,因为涵盖的内容太多,如果从源码一一讲解,那我是不可能这样做的,在以上的基础上,相信你对具体的源码逻辑会有一定了解,祝好!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值