Android事件分发超简单的代码总结篇(二)

前言

与网上其它诸多此类的文章不同,我希望能以最简洁的方式描述清楚整个过程,而最简洁的方式是什么呢?没错,就是代码!简洁的代码!所以我从源码中把涉及到事件分发部分的代码都抽取出来,精简掉无用的,只保留平时常见的部分,一眼就能看明白的那种。

概述

Android的事件分发流程分为两个部分,View的事件分发和ViewGroup事件分发,这篇讲ViewGroup的事件分发。ViewGroup的事件分发比View要复杂些主要涉及到三个相关函数 dispatchTouchEventonInterceptTouchEventonTouchEvent。事件分发顺序从前者到后者。

代码

代码基于API27(Android 8.1)SDK源码精简修改而来(不是纯粹的代码,哈哈~)

dispatchTouchEvent
public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean handled = false;
    // 该值由函数requestDisallowInterceptTouchEvent而来,默认为false
    boolean disallowIntercept = false;
    // mFirstTouchTarget在一个事件起始时默认为null
    // 在成功找到需要消耗事件的子view后被赋值
    TouchTarget mFirstTouchTarget = null;

    if (actionMasked == MotionEvent.ACTION_DOWN
            || mFirstTouchTarget != null) {
        if (!disallowIntercept) {
            intercepted = onInterceptTouchEvent(ev);
        } else {
            intercepted = false;
        }
    } else {
        intercepted = true;
    }

    if (!intercepted) {
        // 遍历子View来分发事件
        for (int i=0; i<getChildCount(); i++) {
            View child = getChildAt(i);
            // 需要满足条件,要么可见,要么正在播放动画,并且要点击的地方在view的满园内
            if (child.getVisibility() == View.VISIBLE || child.getAnimation() != null) {
                if (点击的坐标在这个child范围里) {
                    handled = child.dispatchTouchEvent(ev);
                    if (handled) break;
                }
            }
        }
    }

    if (!handled) {
        // super即为View,所以意思是当作普通的View处理
        handled = super.dispatchTouchEvent(ev);
    }

    return handled;
}
onInterceptTouchEvent
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return false;
}
onTouchEvent
这个代码和上一篇View里的onTouchEvent是一样的,就不贴了

总结

主要的代码都是在dispatchTouchEvent中的,代码很简单,直接看代码即可,但有几点需要说明注意一下

  • 在一个全新的事件(ACTION_DOWN)到来时,首先执行dispatchTouchEvent,然后会调用onInterceptTouchEvent进行拦截,如果拦截成功,接下来的事件就交给自身处理(把自己当成一个普通的view)。
  • 注意onInterceptTouchEvent的调用时机,在ACTION_DOWN时是一定会执行的(当然这都是在没有设置requestDisallowInterceptTouchEvent的情况下),在没有找到消费事件的子View后将不再会触发onInterceptTouchEvent。

链接

Android事件分发超简单的代码总结篇(一)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值