首页 > 代码库 > Android View 按键事件分发流程 onTouch onTouchEvent onClick onLongClick 和 onKey onKeyDown onClick
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,原来同上。
记录只是为了便于查阅。
Android View 按键事件分发流程 onTouch onTouchEvent onClick onLongClick 和 onKey onKeyDown onClick
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。