Android事件处理之View$dispatchTouchEvent(ev)

一,写在前面  

       本篇文章是接着Android事件分发机制之源码解析(ViewGroup篇) 来写的,主要介绍View$dispatchTouchEvent(ev),在ViewGroup篇很详细介绍了事件从Activity开始传递的过程,看这篇文章的哥们,一定是需要看ViewGroup篇的,否则可能对本篇分析View$dispatchTouchEvent(ev)的原因也不太清楚。

         我们知道不管是容器控件ViewGroup,还是原始的View(非容器控件),最终对事件的处理是放在它们的基类--View,由View的dispatchTouchEvent(ev)处理。具体的原因,见Android事件分发机制之源码解析(ViewGroup篇) 。

二,源码分析

查看View$dispatchTouchEvent(ev)源码:

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;
    }
        参数MotionEvent:对触摸的位置,时间等的封装。我们说事件的分发,在代码角度,是由MotionEvent对象在方法间的传递体现。

        首先看第9行,第10行的代码:li != null是一个判空操作,不用管;

        li.mOnTouchListener != null,在我们调用view.setOnTouchListener(OnTouchListener listener)且listener不为空时,其为true;

        li.mOnTouchListener.onTouch(this, event),是一个接口的回调,当onTouch方法返回true时,其为true;

        (mViewFlags & ENABLED_MASK) == ENABLED,如果该View是可用的,其为true。可以调用view.setEnabled(boolean)改变view是否可用,view.isEnabled()查看值。

        

       也就是说只要View是可用的,且调用setOnTouchListener方法,且onTouch(...)方法返回true,那么View$dispatchTouchEvent返回true,事件就被消费掉了。


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值