触摸事件的处理流程

前言

用户通过触摸屏幕与手机交互,所以触摸事件成为了交互中相对重要的因素。比如我们想要点外卖,就要通过手指触摸屏幕打开外卖软件,选择喜爱的菜品下单等待外卖小哥送餐,然而在等待过程中,我们还可以查看当前外卖的状态,这些行为我们都需要触摸屏幕来完成。那么问题来了,应用软件是如何知道手指触摸的是哪一块区域呢/p>

接下来让我们带着问题来分析触摸事件是如何处理的。

触摸事件

当触摸事件产生时,最先传递给Activity,那么我们就从Activity开始剖析。

1.Activity分发事件

从注释1处可以看到getWindow().superDispatchTouchEvent(ev)如果返回true,dispatchTouchEvent(MotionEvent ev)就直接返回true,代表该事件已经被处理,Activity不处理该事件,否则会调用注释2处的onTouchEvent(ev)方法处理事件,继承自Activity的子类可以重写onTouchEvent(ev)方法处理事件。

下面我们来看一下getWindow():

从以上代码可以看出getWindow()返回的是mWindow,mWindow在attach()方法中通过new PhoneWindow(this, window, activityConfigCallback)创建的,Window是抽象类,PhoneWindow是Window的实现类,所以getWindow().superDispatchTouchEvent(ev)实则是调用的PhoneWindow的superDispatchTouchEvent(ev)方法。

2.PhoneWindow分发事件

从superDispatchTouchEvent(MotionEvent event)中可以看到,调用了mDecor.superDispatchTouchEvent(event),mDecor是在PhoneWindow的构造函数中通过preservedWindow.getDecorView()初始化的,详见注释1。

3.DecorView分发事件

从superDispatchTouchEvent(MotionEvent event)中可以看到,调用了super.dispatchTouchEvent(event),DecorView继承自FrameLayout,FrameLayout又继承自ViewGroup,所以super.dispatchTouchEvent(event)实则是调用了ViewGroup的dispatchTouchEvent(event)方法。

4.ViewGroup分发事件

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年6月23日
下一篇 2019年6月23日

相关推荐