Android事件分发机制,通俗易懂的让你想点赞。

438 阅读2分钟

最近已经在开始准备面试了。复习了很多。把温故而知新的知识点,用最简白的白话文表达出来。一呢、是记录下。二呢、万一能帮助大家的话,更好

一、事件分发的3个重要方法

首先我随便建了一个ViewGroup,3个重要方法是

  • dispatchTouchEvent
  • onInterceptTouchEvent
  • onTouchEvent
public class MyViewGroup extends ViewGroup {
    //...省略部分代码
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }
}

然后对这个3个方法做下简单的描述

方法 作用 调用时刻
dispathTouchEvent() 分发(传递)点击事件 当点击事件能够传递给当前View时,该方法就会被调用
onInterceptTouchEvent() 判断是否拦截了某事件(只存在于ViewGroup,普通View没有这个方法) 在dispathTouchEvent()内部调用
onTouchEvent() 处理点击事件 在dispathTouchEvent()内部调用

事件分发顺序是 Activity(Window) --> ViewGroup --> View


二、放大招,分析事件分发流程。

图中:

  • super:调用父类方法
  • true:消费事件,即事件不继续往下传递
  • false:不消费事件,事件也不继续往下传递 / 交由父控件onTouchEvent()处理

看着上面的图和分析如下。总共分3个步骤:


步骤1(在Activity里):

事件首先在Activity里的dispatchTouchEvent()
返回值:
true / false -------> 消费事件(这里false也是消费事件)
super -------------> 事件下发到ViewGroup,调用ViewGroup的dispatchTouchEvent()


步骤2(在ViewGroup里)

事件在ViewGroup里的dispatchTouchEvent()
返回值:
true --------------> 消费事件
false -------------> 不消费事件,也不下发,交给父控件的onTouchEvent()处理
super -------------> 事件下发到当前ViewGroup的onInterceptTouchEvent()

事件在ViewGroup里的onInterceptTouchEvent()
返回值:
true --------------> 事件下发到当前ViewGroup的onTouchEvent()
false / super -----> 事件下发到子View,调用子View的dispatchTouchEvent()

事件在ViewGroup里的onTouchEvent() 返回值:
true --------------> 消费事件
false / super -----> 不消费事件,也不下发,交给父控件的onTouchEvent()处理


步骤3(在子View里)

事件在View里的dispatchTouchEvent() 返回值:
true --------------> 消费事件
false -------------> 不消费事件,也不下发,交给父控件的onTouchEvent()处理
super -------------> 事件下发到当前View的onTouchEvent()

事件在View里的onTouchEvent() 返回值:
true --------------> 消费事件
false / super -----> 不消费事件,也不下发,交给父控件的onTouchEvent()处理


看完这些分析,随口就能来事件分发机制了!!3个步骤概况。有没有激动的让你点赞呢