view事件分发的流程是 Activtiy -Window -View
disapatchEventTouch(){}
看的 sdk不一致,但是大概原理都差不多。
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
setOntouchListener() && view clickable && onTouch() return ture ,则直接返回true;否则就执行 onTouchEvent();
返回true代表事件消费了,不会再继续往下传了。
由于onTouch()返回true,onClick()不再执行,则说明,onClick()in onTouchEvent()里;
onTouchEvent()从ACTION_UP执行进入case语句,然后performClick();
performClick():
public boolean performClick() {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
if (mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
mOnClickListener.onClick(this);
return true;
}
return false;
当我们view .setOnclickListener()时候,我们的mOnClickListener就被赋值了。
所以,就会回调onClick()事件。
网友评论