方法1:
public boolean dispatchTouchEvent(MotionEvent ev)
该方法用来进行事件的分发,即无论ViewGroup或者View的事件,都是从这个方法开始的。
方法2:
public boolean onInterceptTouchEvent (MotionEvent ev)
在方法1内部调用,表示是否拦截当前事件。默认不拦截。
如果拦截了事件,那么将不会分发给子View。
方法3:
public boolean onTouchEvent(MotionEvent ev)
在方法1内部调用,表示是否对事件进行处理。
以上三个方法非常重要,它们的关系可以用如下伪代码呈现:
public boolean dispatchTouchEvent(MotionEvent ev){
boolean handle =false;
if(onInterceptTouchEvent(ev)){
handle = onTouchEvent(ev);
}else{
handle = child.dispatchTouchEvent(ev);
}
return handle;
详细:
if (actionMasked == MotionEvent.ACTION_DOWN) {
cancelAndClearTouchTargets(ev);
resetTouchState();
}
首先这里先判断事件是否为DOWN事件,如果是,则初始化,由于一个完整的事件序列是以DOWN开始,以UP结束,所以如果是DOWN事件,那么说明是一个新的事件序列,所以需要初始化之前的状态。
mFirstTouchTarget =null;
mFirstTouchTarget 最终指向消耗事件的View,如果都不消耗,那么最后事件会交由Activity处理。
onTouch() 方法的返回值决定了 onTouchEvent() 方法要不要执行,如果 onTouch() 返回 true,则 onTouchEvent() 不会再执行,返回 false ,则 onTouchEvent() 继续执行,而 onClick() 的回调是在 onTouchEvent() 方法中调用
网友评论