Connor学Android - View事件分发规则

在这里插入图片描述

Learn && Live

虚度年华浮萍于世,勤学善思至死不渝

前言

Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/Lmbxd,话不多说我们马上开始!

1.方法介绍

(1)public boolean dispatchTouchEvent(MotionEvent ev):用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件

(2)public boolean onInterceptTouchEvent(MotionEvent ev):在上一个方法内调用,用来判断是否拦截某个事件,true表示拦截,false表示不会拦截。如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会被再次调用

(3)public boolean onTouchEvent(MotionEvent event):在dispatchTouchEvent方法中调用,用来处理点击事件,true表示消耗当前事件,false表示不消耗当前事件。如果不消耗,则在同一事件序列中,当前View无法再次接收到事件

下面的伪代码可以表现出三者的关系:

public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean consume = false;
    if (onInterceptTouchEvent(ev)) {
        consume = onTouchEvent(ev);
    } else {
        consume = child.dispatchTouchEvent(ev);
    }
    return consume;
}

2.事件传递规则

在这里插入图片描述
在这里插入图片描述

当一个事件产生后,系统会先根据View树结构由上向下逐级分发事件,再由下向上处理事件,当其中一层拦截并处理事件后,该事件结束

由上向下分发事件顺序:Activity → Window → 顶级View(一般是ViewGroup) → 子层逐级分发事件

由下向上拦截事件顺序:顶级View的其中一个子View的onTouchEvent返回false,则调用上一层的onTouchEvent,逐级向上,若所有元素都不拦截、处理这个事件,最终由Activity的onTouchEvent调用处理

3.几点结论

(1)同一事件序列一定是down —— move —— … —— move —— up

(2)一般情况下,一个事件序列只能被一个View拦截并处理,且同一事件序列中的所有事件都直接交给它处理,且它的onInterceptTouchEvent不会再被调用。但也可以将本该自己处理的事件通过onTouchEvent强行传递给其他View处理

(3)View一旦开始处理事件序列,需要针对不同的事件处理并返回一个boolean值

  • 在处理ACTION_DOWN时返回false,则同一事件序列中的事件不再由它处理,转而调用父元素的onTouchEvent处理。
  • 在处理除ACTION_DOWN以外的其他事件时返回false,则不会交由父元素处理,且当前View可以接收后续的事件,最终这些未被处理的事件会传递给Activity处理

(4)ViewGroup默认不拦截任何事件,即ViewGroup的onInterceptTouchEvent默认返回false

(5)View没有onInterceptTouchEvent,一旦有事件传递给它,直接调用onTouchEvent

(6)View的enable属性不影响onTouchEvent的默认返回值。只要它的clickable或longClickable有一个为true,onTouchEvent就返回true

(7)onClick被调用的前提是View是clickable的,且收到了down、up事件

ent

(8)事件的传递总是先父后子,但requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但ACTION_DOWN事件除外

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ConnorYan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值