Android基础(28)事件分发

作者: perry_Fan | 来源:发表于2019-03-03 14:43 被阅读70次

1)请描述一下View事件传递分发机制
2)Touch事件传递流程
3)事件分发中的onTouch 和onTouchEvent 有什么区别,又该如何使用?
4)View和ViewGroup分别有哪些事件分发相关的回调方法

一. 基础认知
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 结束事件(非人为原因)
  • 特别说明:事件列
    从手指接触屏幕 至 手指离开屏幕,这个过程产生的一系列事件


1.2 事件分发的本质

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

1.3 事件在哪些对象之间进行传递?

答:Activity、ViewGroup、View


1.4 事件分发的顺序

Activity -> ViewGroup -> View

1.5 事件分发过程由哪些方法协作完成?
二. 事件分发机制源码分析
  • 要想充分理解Android分发机制,本质上是要理解:
    1. Activity对点击事件的分发机制
    2. ViewGroup对点击事件的分发机制
    3. View对点击事件的分发机制
2.1 Activity的事件分发机制

当一个点击事件发生时,事件最先传到ActivitydispatchTouchEvent()进行事件分发

2.2 ViewGroup事件的分发机制

2.3 View事件的分发机制

2.4 总结

2.5 伪代码阐述关系
/**
  * 点击事件产生后
  */ 
  // 步骤1:调用dispatchTouchEvent()
  public boolean dispatchTouchEvent(MotionEvent ev) {

    boolean consume = false; //代表 是否会消费事件

    // 步骤2:判断是否拦截事件
    if (onInterceptTouchEvent(ev)) {
      // a. 若拦截,则将该事件交给当前View进行处理
      // 即调用onTouchEvent ()方法去处理点击事件
        consume = onTouchEvent (ev) ;

    } else {

      // b. 若不拦截,则将该事件传递到下层
      // 即 下层元素的dispatchTouchEvent()就会被调用,重复上述过程
      // 直到点击事件被最终处理为止
      consume = child.dispatchTouchEvent (ev) ;
    }

    // 步骤3:最终返回通知 该事件是否被消费(接收 & 处理)
    return consume;

   }

https://blog.csdn.net/carson_ho/article/details/54136311

相关文章

网友评论

    本文标题:Android基础(28)事件分发

    本文链接:https://www.haomeiwen.com/subject/cyemeqtx.html