最近已经在开始准备面试了。复习了很多。把温故而知新的知识点,用最简白的白话文表达出来。一呢、是记录下。二呢、万一能帮助大家的话,更好
一、事件分发的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()处理