1. 说明
对于自定义View的 onTouchEvent(),一般在开发过程中,直接让其 return true即可,之前并没有说为什么这样做,这样做的目的是什么,下边来分析下onTouchEvent()的源码;
2. ViewGroup的dispatchTouchEvent()源码如下:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final boolean canceled = resetCancelNextUpFlag(this)
|| actionMasked == MotionEvent.ACTION_CANCEL;
if (!canceled && !intercepted) {
resetCancelNextUpFlag(child);
if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) {
newTouchTarget = addTouchTarget(child, idBitsToAssign);
}
}
}
return handled;
}
private TouchTarget addTouchTarget(@NonNull View child, int pointerIdBits) {
final TouchTarget target = TouchTarget.obtain(child, pointerIdBits);
target.next = mFirstTouchTarget;
mFirstTouchTarget = target;
return target;
}
3. onTouch()源码触摸流程
分析上图可知:当按下button控件后的事件分发
比如我按下这个控件,这个就是 Action_Down:
1>:父父布局会分发事件给父布局,父布局会分发事件给子布局,如果里边还有布局,它会一层一层的往里边去分发,分发调用dispatchTouchEvent();
2>:父布局是调用ViewGroup的dispatchTouchEvent()方法,子布局是调用View的dispatchTouchEvent()方法,而View是没有onInterceptEvent()拦截方法;
如果onTouchEvent()是:return false:
1>:ViewGroup的源码:表示dispatchTransformedTouchEvent()返回的是false,就不会调addTouchTarget()方法,那么mFirstTouchTarget是空;
2>:在Action_Move时,intercepted=true,那么if(!canceled && !intercepted)返回false,那么View的dispatchTouchEvent()方法不会执行,所以View的onTouchEvent()方法也不会执行,所以就不会处理任何所有自定义View事件;
如果onTouchEvent()是:return true:
1>:当return true时,mFirstTouchTarget就不是空,那么intercepted=false,if(!canceled && !intercepted)返回true,就会再次进到dispatchTransformTouchEvent(),就又会向下执行了,就可以处理自定义View事件了;