Android中onTouch,onTouchEvent,onClick优先级,关系
1.基础介绍
onTouch:指的是View设置的OnTouchListener接口的onTouch()方法
onTouchEvent:指的是事件分发中的重要方法(dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent)
onClick:指的是View设置的OnClickListener接口的onClick()方法
2.源码分析
首先看一下View的dispatchTouchEvent方法(删掉了多余的代码)
public boolean dispatchTouchEvent(MotionEvent event) { boolean result = false; if (onFilterTouchEventForSecurity(event)) { //noinspection SimplifiableIfStatement ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { result = true; } if (!result && onTouchEvent(event)) { result = true; } } return result; }
其中mOnTouchListener指的就是我们通过 setOnTouchListener()设置的接口,可以知道如果onTouch()返回true的话,事件就被消化,onTouchEvent()就不会收到事件了,所以onTouch比onTouchEvent优先级高
接着看一下onTouchEvent()
public boolean onTouchEvent(MotionEvent event) { final float x = event.getX(); final float y = event.getY(); final int viewFlags = mViewFlags; final int action = event.getAction(); if (((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) || (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE) { switch (action) { case MotionEvent.ACTION_UP: boolean prepressed = (mPrivateFlags & PFLAG_PREPRESSED) != 0; if ((mPrivateFlags & PFLAG_PRESSED) != 0 || prepressed) { // take focus if we don't have it already and we should in // touch mode. if (!mHasPerformedLongPress && !mIgnoreNextUpEvent) { // This is a tap, so remove the longpress check removeLongPressCallback(); // Only perform take click actions if we were in the pressed state if (!focusTaken) { // Use a Runnable and post this rather than calling // performClick directly. This lets other visual state // of the view update before click actions start. if (mPerformClick == null) { mPerformClick = new PerformClick(); } if (!post(mPerformClick)) { performClick(); } } } } mIgnoreNextUpEvent = false; break; } return true; } return false; }
接着看看performClick()
public boolean performClick() { final boolean result; final ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); li.mOnClickListener.onClick(this); result = true; } else { result = false; } sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); return result; }
从中可以看出在onTouchEvent()中,调用了我们设置的OnClickListener()接口中的onClick(),所以onTouchEvent优先级高于onClick
总结
优先级从高到低:onTouch>onTouchEvent>onClick