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

本文深入探讨了Android事件分发机制,重点关注View类的dispatchTouchEvent方法。通过源码分析,解释了如何判断事件是否被消费,以及setOnTouchListener和setOnClickListener在事件处理中的优先级。文章指出,当onTouch返回true时,事件会被消费,而onClick只能在onTouch返回false或未设置OnTouchListener时起作用。
摘要由CSDN通过智能技术生成

一,写在前面  

       本篇文章是接着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,事件就被消费掉了。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值