標籤:
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,原來同上。
記錄只是為了便於查閱。
Android View 按鍵事件分發流程 onTouch onTouchEvent onClick onLongClick 和 onKey onKeyDown onClick