dispatchTouchEvent事件分发浅析(五)消费

上一篇,我们大体理解了Intercept拦截 而之前 也了解了 分发的过程, 和简单点击,分析了执行顺序

具体代码可以见https://github.com/2954722256/demo_event

这篇简单理解下 消费(本篇应该不难,主要是理解)


回顾

前面,我们有说过, 如果我们点击一个View,会dispatchTouchEvent到对应的View 这个时候,就消费掉了, 不会回传 如果我们点击一个ViewGroup,会dispatchTouchEvent到对应的ViewGroup 这个时候,不会被消费,会回传

那么,会不会有点击一个 ViewGroup的时候,不回传的时候呢? 也就在ViewGroup消费呢?

我们试试


代码

还是之前拦截的代码


给ViewGroup添加点击事件

Paste_Image.png

点击 自定义的EventButton 可以发现对应的过程

MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
EventViewGroup  ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
MainActivity    ----    LL setOnTouchListener  onTouch  ---->   ACTION_DOWN ---->   noMsg
EventViewGroup  ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
MainActivity    ----    LL setOnClickListener  onClick  ---->   nullEvent   ---->   noMsg

Paste_Image.png

我们可以发现,此时ViewGroup也没有回传 对应的点击执行顺序 和 View 类似, 到对应的Touch之后, 到最后的 onClick, 都没有回传了


给ViewGroup添中的ViewGroup添加点击事件

Paste_Image.png

点击 自定义的TouchEventChilds 可以发现对应的过程

MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventFather    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventFather    ----    onInterceptTouchEvent   ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    onInterceptTouchEvent   ---->   ACTION_DOWN ---->   noMsg
MainActivity    ----    childs setOnTouchListener  onTouch  ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
MainActivity    ----    childs setOnClickListener  onClick  ---->   nullEvent   ---->   noMsg

Paste_Image.png

我们可以发现 和前面差不多 对应的点击执行顺序 和 View 类似, 到对应的Touch之后, 到最后的 onClick, 都没有回传了


ViewGroup添加点击事件,但点击里面的Button

Paste_Image.png

点击 自定义的TouchEventChild2的Button 可以发现对应的过程

MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventFather    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventFather    ----    onInterceptTouchEvent   ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    onInterceptTouchEvent   ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds2   ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds2   ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg

Paste_Image.png

我们可以发现 和前面差不多 对应的点击执行顺序 和 View 类似, 到对应的Touch之后, 都没有回传了 但是没有执行ViewGroup的TouchEvent和ClickListener等操作


简单小结

大体可以发现 · 我们点击是先通过 dispatchTouchEvent 传到点击的控件后, 再回传判断 Touch或者Click操作的。 如果回传的过程中,有多个可以消费的地方, 在离回传最近的地方进行消费 后面的控件获得不到监听


添加 onInterceptTouchEvent拦截

这个时候, 如果我们在Child上面,添加拦截 再点击Child2

Paste_Image.png

MainActivity    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventFather    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventFather    ----    onInterceptTouchEvent   ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    dispatchTouchEvent  ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    onInterceptTouchEvent   ---->   ACTION_DOWN ---->   noMsg
MainActivity    ----    childs setOnTouchListener  onTouch  ---->   ACTION_DOWN ---->   noMsg
TouchEventChilds    ----    onTouchEvent    ---->   ACTION_DOWN ---->   noMsg
MainActivity    ----    childs setOnClickListener  onClick  ---->   nullEvent   ---->   noMsg

Paste_Image.png

我们可以发现,被拦截以后,就不会继续向下 dispatchTouchEvent了, 这时候,Child的消费是最近的,所以会响应Child对应的Touch和Click相关的事件

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发之途

Android TouchEvent事件分发机制详解(1)

16850
来自专栏向治洪

View,ViewGroup的Touch事件的分发机制

ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?这个我还真不知道,这里...

26770
来自专栏向治洪

android viewgroup事件分发机制

今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对ViewGroup事件分...

20760
来自专栏郭霖

Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

记得在前面的文章中,我带大家一起从源码的角度分析了Android中View的事件分发机制,相信阅读过的朋友对View的事件分发已经有比较深刻的理解了。 还未阅读...

287100
来自专栏Android Note

Android-录屏APP该怎么实现?

18120
来自专栏曾大稳的博客

Android ViewGroup事件分发

上篇文章已经分析了Android的Touch事件分发。如果没看的建议先看一下。Android View的Touch事件分发。 接下来我们开始写几种场景,得出一个...

32120
来自专栏中国Android研究院

进阶必备-Android事件分发机制

或许你会问,“为什么我一定要知道View的事件分发机制?”。因为我们在实际开发的过程中,经常会遇到多层的View互相嵌套以后,对某一个View进行滑动的时候,特...

14240
来自专栏非著名程序员

图解 Android 事件分发机制

在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功...

34390
来自专栏移动开发面面观

Android事件分发备忘

12530
来自专栏懒人开发

dispatchTouchEvent事件分发浅析(二)分发

具体代码可以见https://github.com/2954722256/demo_event

17830

扫码关注云+社区

领取腾讯云代金券