整体思路概述
Android中应用层触摸事件的分发,我们可以认为是从Activity开始的。Activity接收到触摸事件后就开始向该Activity所包含的View树中分发该事件,试图找到对应的View来处理该触摸事件。
举一个我们经常遇到的例子:
我们在开发某一款APP。某天,老板突发奇想想要加一个需求。于是就找人来做。就找到了CTO(Activity),说完需求后,CTO认为值得一试。就把该需求指派给Android开发经理(相当于一个ViewGroup)。Android开发经理听完需求后,就再自己团队里面找在这个方面比较资深的Android工程师(View)来处理这个事情。Android开发工程师接到任务后,就立马开工去干了,至此该需求终于有人去做了,该需求被这个Android工程师消费了,需求传递流程结束。
该例子我以后还会用哦
触摸事件各API的介绍
本文这部分对触摸事件API的几个关键API做出介绍,让大家对触摸事件分发有个基本概念,为理解接下来的触摸事件分发流程分析降低理解难度。
- Activity中的触摸事件API
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
- ViewGroup中的触摸事件API
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
public boolean onInterceptTouchEvent(MotionEvent ev);
- View中的触摸事件API
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
1、dispatchTouchEvent-------------(Activity、ViewGroup、View)
顾名思义,该方法负责触摸事件的调度,是总调度官。
底层将触摸事件传递给Activity,Activity将事件传递给ViewGroup,ViewGroup将事件传递给View或另一个ViewGroup,都是通过调用该接口实现的。
理解dispatchTouchEvent()是理解Android事件机制的关键;而其中,最关键和复杂的的就是ViewGroup中的dispatchTouchEvent()。
onInterceptTouchEvent()和onTouchEvent()都是在该接口的实现方法中被调用的。
理解dispatchTouchEvent()的返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响,表示是否消耗了该事件。
2、onInterceptTouchEvent-------------(ViewGroup)
它是拦截触摸事件的接口,返回结果表示是否拦截某个事件的向下级ViewTree的传递。
该方法仅存在于ViewGroup类中,对于View类并无此方法。
在ViewGroup的dispatchTouchEvent方法内部调用,用来判断是否拦截某个事件继续向下传递,如果当前 ViewGroup 拦截了某个事件,那在同一个事件序列中,此方法不会再次调用,返回结果表示是否拦截当前事件。默认不拦截,返回false。
由于一个View只能处于最底层,它不会存在子控件,所以无该方法。
3、onTouchEvent-------------(Activity、ViewGroup、View)
用来处理事件,是触摸事件的处理者
在dispatchTouchEvent方法中调用,用来处理点击事件。
无论是Activity, ViewGroup还是View,对触摸事件的处理,基本上都是在onTouchEvent()中进行的。
该方法如果返回true,表示触摸事件被它处理过了;或者,换句话说,表示它消费了触摸事件。否则,表示它没有消费该触摸事件。
对于返回的结果用来表示是否消耗掉当前事件。如果不消耗当前事件的话,那么对于在同一个事件序列当中,当前View就不会再次接收到事件。
,返回结果表示是否消耗当前事件,如果不消耗,在同一事件序列里,当前View无法再次接收到事件