原创

Android事件分发机制(一)——Activity的事件分发

一、什么是事件分发?

  • 用户通过屏幕与手机进行交互的时候,每一次点击、长按、移动等都是一个事件。
  • 事件分发机制:某一个事件从屏幕传递到各个View,由View来使用这一事件(消费事件)或者忽略掉这一事件(不消费事件),这整个过程的控制。

1.1 事件分发的对象是什么呢?

  • 系统把事件封装成MotionEvent对象,事件分发的过程就是MotionEvent分发的过程。

MotionEvent的类型如下:

  • 按下(ACTION_DOWN)
  • 移动(ACTION_MOVE)
  • 抬起(ACTION_UP)
  • 取消(ACTION_CANCEL)

一个事件序列是从手指按下屏幕开始,到手指离开屏幕时所产生的一系列事件。

主要的传递对象有:

  • Activity
  • ViewGroup
  • View

事件分发的传递对象以及顺序如下所示:

  • Activity -> Window -> DecorView -> ViewGroup -> View

二、Activity的事件分发

Activity的事件分发流程图如下:

Activity事件分发.png

Activity的主要方法有:

  • dispatchTouchEvent(MotionEvent ev)
  • onTouchEvent(MotionEvent ev)

事件由Activity的dispatchTouchEvent(MotionEvent ev)方法开始:

Activity的dispatchTouchEvent.png

如果当前的事件为ACTION_DOWN,则调用onUserInteraction()方法,此方法默认是一个空方法。如果没有重写此方法,就不必关注此方法。

Activity的onUserInteraction.png

如果getWindow().superDispatchTouchEvent(ev)为true,则返回true,事件被消费。

Window的superDispatchTouchEvent.png

Window是一个抽象类.png

Window是一个抽象类,其superDispatchTouchEvent(ev)方法为抽象方法,具体实现在其唯一子类——PhoneWindow中。

PhoneView的superDispatchTouchEvent.png

PhoneWindow持有DecorView的实例,并在此方法中调用DecorView的superDispatchTouchEvent(ev).

PhoneView中的DecorView.png

DecorView中的superDispatchTouchEvent.png

在DecorView的superDispatchTouchEvent(ev)方法中又调用了父类的dispatchTouchEvent(ev)方法。DecorView继承自FrameLayout,但是FrameLayout中并没有dispatchTouchEvent(ev)方法的实现,由此可见,DecorView中调用的是ViewGroup下的dispatchTouchEvent(ev)方法。

ViewGroup的dispatchTouchEvent.png

此时就已经将事件传递到ViewGroup上了,再有ViewGroup的dispatchTouchEvent(ev)方法对事件进行派发。

如果getWindow().superDispatchTouchEvent(ev)为false,则Activity调用onTouchEvent(ev)方法,此时Activity的dispatchTouchEvent(ev)方法的返回值等于Activity的onTouchEvent(ev),事件结束。

Activity的onTouchEvent方法.png

学海无涯苦作舟

个人博客:http://www.coderlearning.cn/

我的微信公众号.jpg

进阶知识
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-12-16 10:06
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码