我们先看到 view.dispatchTouchEvent 方法源码:
View.java api29 public boolean dispatchTouchEvent(MotionEvent event) { // 首先处理辅助功能事件 if (event.isTargetAccessibilityFocus()) { // 本控件没有获取到焦点,不处理事件 if (!isAccessibilityFocusedViewOrHost()) { return false; } // 获取到焦点,按照常规处理事件 event.setTargetAccessibilityFocus(false); } // 表示是否消费事件 boolean result = false; // 一致性检验器,检验事件是否一致 if (mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onTouchEvent(event, 0); } // 如果是down事件,停止嵌套滑动 final int actionMasked = event.getActionMasked(); if (actionMasked == MotionEvent.ACTION_DOWN) { stopNestedScroll(); } // 安全过滤,本窗口位于非全屏窗口之下时,可能会阻止控件处理触摸事件 if (onFilterTouchEventForSecurity(event)) { if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) { // 如果事件为鼠标拖动滚动条 result = true; } // 先调用onTouchListener监听器 // 当我们设置onTouchEventListener之后,L ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { result = true; } // 若onTouchListener没有消费事件,调用onTouchEvent方法 if (!result && onTouchEvent(event)) { result = true; } } // 一致性检验 if (!result && mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onUnhandledEvent(event, 0); } // 如果是事件序列终止事件或者没有消费down事件,终止嵌套滑动 if (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_CANCEL || (actionMasked == MotionEvent.ACTION_DOWN && !result)) { stopNestedScroll(); } return result; }Android事件分发机制二:viewGroup与view对事件的处理 (9)
内容版权声明:除非注明,否则皆为本站原创文章。