1.为了测试,我们同时将View 设置 onTouch onTouchEvent onClick onLongClick 四个事件,经过加打印测试发现,按键分发流程是这样的 如果是短按:onTouch-->>onTouchEvent--->>onClick 。长按:onTouch-->>onTouchEvent--->>onLongClick-->>onClick。为什么会是这样?
我们看View 源码
public boolean dispatchTouchEvent(MotionEvent event) { if (mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onTouchEvent(event, 0); } if (onFilterTouchEventForSecurity(event)) { //noinspection SimplifiableIfStatement ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { return true; } if (onTouchEvent(event)) { return true; } } if (mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onUnhandledEvent(event, 0); } return false; }
分析:在事件分发方法里面,先执行
if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { return true; }
如果 onTouch 返回值为true,那么事件就在这里被消费了。事件就不分发下去,不会执行onTouchEvent事件,之后的事件也不执行。如果onTouch返回值为false,事件继续分发下去,执行
if (onTouchEvent(event)) { return true; }
然后才执行onLongClick 事件,然后在执行onClick事件。只要之前的按键事件没有被消费,那么事件会被继续分发出来。直到消费完为止。
2.同样 给View 设置 onKey onKeyDown onClick 等事件,同理分发流程是:onKey -->>onKeyDown --->>onClick,原来同上。
记录只是为了便于查阅。
时间: 2024-10-10 03:32:53