View事件分发机制

backgroud

由于在《Android进阶之光》中作者用了比较大的篇幅来介绍ViewViewGroup的源码,以理解关于事件分发机制的原理。且本人还没有去阅读源码,故而这里就直接摘要自己感觉重要的部分。毕竟还是不要误导他人的好。

在这里插入图片描述

ViewViewGroup的涉及方法

在了解了什么是事件分发后,我们还需要了解事件分发的3个重要方法。点击事件有3个重要的方法,它们分别是:

  • dispatchTouchEvent(MotionEvent ev)—用来进行事件的分发。
  • onInterceptTouchEvent(MotionEvent ev)—用来进行事件的拦截,在dispatchTouchEvent()中调用,需要注意的是View没有提供该方法。
  • onTouchEvent(MotionEvent ev)—用来处理点击事件,在dispatchTouchEvent()方法中进行调用。

1. 点击事件由上而下的传递规则

    当点击事件产生后会由 Activity 来处理,传递给PhoneWindow,再传递给DecorView,最后传递给顶层的ViewGroup

一般在事件传递中只考虑 ViewGrouponInterceptTouchEvent 方法,因为一般情况下我们不会重写 dispatchTouchEvent()方法。

对于根ViewGroup,点击事件首先传递给它dispatchTouchEvent()方法,如果该ViewGrouponInterceptTouchEvent()方法返回true,则表示它要拦截这个事件,这个事件就会交给它的onTouchEvent()方法处理;

如果onInterceptTouchEvent()方法返回false,则表示它不拦截这个事件,则这个事件会交给它的子元素dispatchTouchEvent()来处理,如此反复下去。

如果传递给底层的ViewView是没有子View的,就会调用ViewdispatchTouchEvent()方法,一般情况下最终会调用ViewonTouchEvent()方法。

【注意】onInterceptTouchEvent()方法默认返回false,不进行拦截。如果想要让ViewGroup拦截事件,那么应该在自定义的ViewGroup中重写这个方法。
在这里插入图片描述

2. 点击事件由下而上的传递规则

    当点击事件传给底层的View 时,如果其onTouchEvent()方法返回true,则事件由底层的View消耗并处理;

如果返回false则表示该View不做处理,则传递给父ViewonTouchEvent()处理;

如果父ViewonTouchEvent()仍旧返回false,则继续传递给该父View的父View处理,如此反复下去。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

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

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

打赏作者

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

抵扣说明:

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

余额充值