相关的方法
- 分发
public boolean dispatchTouchEvent(MotionEvent ev)
如果事件能够传递给当前 View,那么此方法一定会被调用,返回结果受当前 View 的 onTouchEvent 和下级 View 的 dispatchTouchEvent 方法影响, 表示是否消耗当前事件; - 拦截
public boolean onInterceptTouchEvent(MotionEvent event)
返回结果表示是否拦截当前事件; - 消耗
public boolean onTouchEvent(MotionEvent event)
用来处理点击事件,返回结果表示是否消耗当前事件。
三个方法之间的关系
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if (onInterceptTouchEvent (ev)) {
consume = onTouchEvent (ev);
} else {
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
实例分析
dispatchTouchEvent 是事件分发的第一步,但是不太会去改写这个方法,所以暂时不管。
备注
- 同一个事件序列是指从手指接触屏幕那一刻起,到手指离开屏幕的那一刻结束,在这个过程中产生的一系列事件,这个序列以 down 事件开始,中间有数量不定的 move 事件,最后以 up 事件结束;
- 某个 View 一旦决定拦截,那么这一个事件序列都只能由它来处理,并且 onTnterceptTouchEvent 不会再被调用。