当前位置: 代码迷 >> Android >> Android View 按键事件散发流程 onTouch onTouchEvent onClick onLongClick 和 onKey onKeyDown onClick
  详细解决方案

Android View 按键事件散发流程 onTouch onTouchEvent onClick onLongClick 和 onKey onKeyDown onClick

热度:832   发布时间:2016-04-28 02:41:35.0
Android View 按键事件分发流程 onTouch onTouchEvent onClick onLongClick 和 onKey onKeyDown onClick

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,原来同上。

记录只是为了便于查阅。


测试代码:测试代码

  相关解决方案