码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-01-21 22:27:48      阅读:397      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://blog.csdn.net/feiduclear_up/article/details/42978447

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!