Android事件分发机制

2018-08-03  本文已影响0人  测天测地测空气
  1. 基础认知
    1.1 事件分发的对象是谁?
    答:点击事件(Touch事件)

定义
当用户触摸屏幕时(View 或 ViewGroup派生的控件),将产生点击事件(Touch事件)
Touch事件的相关细节(发生触摸的位置、时间等)被封装成MotionEvent对象

事件类型(4种)
事件类型 具体动作
MotionEvent.ACTION_DOWN 按下View(所有事件的开始)
MotionEvent.ACTION_UP 抬起View(与DOWN对应)
MotionEvent.ACTION_MOVE 滑动View
MotionEvent.ACTION_CANCEL 结束事件(非人为原因)
特别说明:事件列
从手指接触屏幕 至 手指离开屏幕,这个过程产生的一系列事件

image.png

即当一个点击事件(MotionEvent )产生后,系统需把这个事件传递给一个具体的 View 去处理。

1.2 事件分发的本质
答:将点击事件(MotionEvent)传递到某个具体的View & 处理的整个过程

即 事件传递的过程 = 分发过程。

1.3 事件在哪些对象之间进行传递?
答:Activity、ViewGroup、View

Android的UI界面由Activity、ViewGroup、View 及其派生类组成

image.png
image.png

1.4 事件分发的顺序

即 事件传递的顺序:Activity -> ViewGroup -> View

即:1个点击事件发生后,事件先传到Activity、再传到ViewGroup、最终再传到 View

image.png

1.5 事件分发过程由哪些方法协作完成?

答:dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()

image.png

1.6 总结

image

至此,相信大家已经对 Android的事件分发有了感性的认知
下面,我将详细介绍Android事件分发机制

  1. 事件分发机制 源码分析
    请谨记:Android事件分发流程 = Activity -> ViewGroup -> View
    即:1个点击事件发生后,事件先传到Activity、再传到ViewGroup、最终再传到 View
image.png

从上可知,要想充分理解Android分发机制,本质上是要理解:
Activity对点击事件的分发机制
ViewGroup对点击事件的分发机制
View对点击事件的分发机制
下面,我将通过源码,全面解析 事件分发机制
即按顺序讲解:Activity事件分发机制、ViewGroup事件分发机制、View事件分发机制

2.1 Activity的事件分发机制
当一个点击事件发生时,事件最先传到Activity的dispatchTouchEvent()进行事件分发

2.1.1 源码分析

/**

/**

  }
  // 回到最初的调用原处

/**

*/
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {

    return mDecor.superDispatchTouchEvent(event);
    // mDecor = 顶层View(DecorView)的实例对象
    // ->> 分析3
}

/**

*/
public boolean superDispatchTouchEvent(MotionEvent event) {

    return super.dispatchTouchEvent(event);
    // 调用父类的方法 = ViewGroup的dispatchTouchEvent()
    // 即 将事件传递到ViewGroup去处理,详细请看ViewGroup的事件分发机制

}
// 回到最初的调用原处

/**

*/
public boolean onTouchEvent(MotionEvent event) {

    // 当一个点击事件未被Activity下任何一个View接收 / 处理时
    // 应用场景:处理发生在Window边界外的触摸事件
    // ->> 分析5
    if (mWindow.shouldCloseOnTouch(this, event)) {
        finish();
        return true;
    }
    
    return false;
    // 即 只有在点击事件在Window边界外才会返回true,一般情况都返回false,分析完毕
}

/**

上一篇 下一篇

猜你喜欢

热点阅读