android基础Android资料Android Class

窥探Android Touch事件内幕系列之一

2016-09-19  本文已影响598人  桃子妈咪

最近在使用Robolectric进行单元测试的时候经常需要模拟click、touch等UI操作,期间遇到了各种问题,例如:onTouch和onTouchEvent有什么区别?onClick什么时候会响应?使用ShadowView中clickOn模拟点击操作为什么无法响应onTouch?为什么ListView添加滑动菜单功能后,ListView本身不能再滑动?被这些问题困扰了很久,因此决定彻底搞清楚Android Touch事件分发机制。这篇文章先整体介绍了Android UI事件处理机制-基于监听的处理方式和基于回调的处理方式,然后分别从View、ViewGoup角度分析Touch事件背后的实现逻辑,最后结合Robolectric介绍如何在单元测试中测试相关的回调、监听方法。

Android UI事件处理机制

事件是指一个对象的状态发生变化,事件处理是指事件发生时执行的代码。与界面编程相关的就是UI事件-用户在程序界面中执行各种操作,之后应用程序需要对这些操作提供响应动作,这个响应就是由UI事件的处理机制来完成。

Android针对UI事件,提供了两种处理机制:一种是基于监听方式的处理机制,另一种是基于回调方式的处理机制。对于基于监听的处理方式,主要是为Android 界面组件绑定特定的事件监听器;对于基于回调的处理方式,主要的做法是通过为Android 组件重写�特定的回调方法实现。下面我们详细介绍二者具体模型、流程、使用方法。

基于监听的事件处理机制

基于监听的事件处理方式实际是一种委托式(代理)模式,某个组件(事件源)将整个事件的处理委托给特定的对象(绑定在该组件上的事件监听器),由这个特定的对象来进行该事件的响应。

事件监听处理模型

事件监听处理模型涉及到三类对象:

事件处理流程

简单来说,基于监听器的事件处理流程是事件源组件发生事件,系统会执行该事件源组件上监听器的对应处理方法。具体流程如下图所示。

基于监听的事件处理流程.png
常见的事件监听器实现方式

在事件处理模型三个重要组成部分中,事件由系统负责生成、任意界面组件都可作为事件源,而事件监听器是整个事件处理核心。因此我们主要的工作就是实现事件监听器。所谓实现事件监听器其实就是实现特定接口的Java类实例,常用的方法包括:

基于回调的事件处理机制

与监听的委托式事件处理不一样,基于回调事件处理模型,事件源和事件监听器是统一的。用户在组件上激发某个事件,组件自己特定的方法将会负责处理该事件。通常实现的方法是通过继承组件类,重写相关的事件处理方法。

基于回调的事件传播

基于回调的事件处理方法都有一个boolean返回值,使用该返回值标识该回调方法是否已经完全消费该事件。

二者对比

基于监听器的事件处理机制优点:

基于回调的事件处理机制优点:

Android Touch 事件分发、响应机制

Android UI事件包括Touch事件、Key事件等,我们这里主要研究Touch事件分发、消费的流程。Touch事件分发消费流程中包括两个主角:View和ViewGroup(Activity的Touch事件实际上是调用它内部的ViewGroup的Touch事件)。Touch事件类型包括ACTION_DOWN,ACTION_UP,ACTION_MOVE。这里我们通过解析View、ViewGroup事件分发响应的源码,来对Android Touch事件的分发进行研究。

View Touch事件响应详细流程

View中关于Touch事件主要涉及两个方法:dispatchTouchEvent、onTouchEvent。Android View 事件分发机制 源码解析 (上)中结合实例及源码对这两个方法进行了详细研究,具体细节可参考该文章。

dispatchTouchEvent

View的dispatchTouchEvent主要就是将事件按照onTouchListener监听器、onTouchEvent事件回调的顺序依次分发。任意一个返回true则表示该事件已经被当前这个View处理了。再回过头来看上面我们提到的Android提供的两种事件处理方法优缺点中『Android事件处理机制优先触发该组件绑定的事件监听器,然后才会触发该组件提供的事件回调方法。即监听机制优先级更高。』,这段话是不是更能理解了?


View的dispatchTouchEvent流程图.png
onTouchEvent

View的onTouchEvent是Android系统处理Touch事件的回调方法,这个方法针对不同事件类型-ACTION_DOWN、ACTION_MOVE、ACTION_UP分别进行处理,我们下面也按照这三种事件类型进行分析。

View的onTouchEvent流程图 .png
总结

下一篇将总结ViewGroup Touch事件处理流程及如何结合Robolectric在单元测试中测试Touch相关的回调方法、监听器。

上一篇 下一篇

猜你喜欢

热点阅读