事件分发机制3-viewgroup的分发流程move

2024-05-09 15:18

本文主要是介绍事件分发机制3-viewgroup的分发流程move,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

笔记之后整理

move分发流程还是要从viewgroup的dispatchTouchEvent方法看起

 

if (actionMasked == MotionEvent.ACTION_DOWN|| mFirstTouchTarget != null)

因为mFirstTouchTarget !=null  会进入语句 判断拦不拦截 不拦截继续

 

源码中move不会再分发事件了  mFirstTouchTarget不为null  直接走else

 代码1boolean alreadyDispatchedToNewTouchTarget = false;

 if (mFirstTouchTarget == null) {

                // No touch targets so treat this as an ordinary view.

                handled = dispatchTransformedTouchEvent(ev, canceled, null,

                        TouchTarget.ALL_POINTER_IDS);

            } else {

                // Dispatch to touch targets, excluding the new touch target if we already

                // dispatched to it.  Cancel touch targets if necessary.

                TouchTarget predecessor = null;

                TouchTarget target = mFirstTouchTarget;

                while (target != null) {

 

                    final TouchTarget next = target.next;

 代码2         if (alreadyDispatchedToNewTouchTarget && target == newTouchTarget) {

                        handled = true;

                    } else {

代码3                        final boolean cancelChild = resetCancelNextUpFlag(target.child)

                                || intercepted;

代码4                        if (dispatchTransformedTouchEvent(ev, cancelChild,

                                target.child, target.pointerIdBits)) {

                            handled = true;

                        }

                        if (cancelChild) {

                            if (predecessor == null) {

                                mFirstTouchTarget = next;

                            } else {

                                predecessor.next = next;

                            }

                            target.recycle();

                            target = next;

                            continue;

                        }

                    }

                    predecessor = target;

                    target = next;

                }

            }

只循环一次,代码1 alreadyDispatchedToNewTouchTarget = false;

所以在代码2判断时走else方法  在代码4的地方进行分发给  target.child

Target.child就是down事件中addTouchTarget(child, idBitsToAssign)的target

最后就交给view的dispatchTouchEvent

 

如何处理事件冲突 -- 只能在move的时候处理事件冲突

内部拦截 :子view处理事件冲突

假如父容器的interceptTouchEvent返回true

             if (!disallowIntercept) {

                    intercepted = onInterceptTouchEvent(ev);

                    ev.setAction(action); // restore action in case it was changed

                } else {

                    intercepted = false;

                }

 

Intercepted = true就不会走事件分发的代码。disallowIntercept为false的话就不会走父容器的

onInterceptTouchEvent方法  所以需要改变disallowIntercept的值 requestDisallowInterceptTouchEvent

 

   @Override

    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {

 

        if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {

            // We're already in this state, assume our ancestors are too

            return;

        }

 

        if (disallowIntercept) {

            mGroupFlags |= FLAG_DISALLOW_INTERCEPT;

        } else {

            mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;

        }

 

        // Pass it up to our parent

        if (mParent != null) {

            mParent.requestDisallowInterceptTouchEvent(disallowIntercept);

        }

    }

第一个move事件的目的是取消listview.cancel事件

 

第二个move事件 intercepted = true  不分发       走if 自己消费

父容器可以抢子view的时间 ,子view不可以抢父容器的事件

子view一旦拿到时间 再怎么处理由子view说的算

 

外部拦截:父容器处理冲突

 

 

 

 

 

这篇关于事件分发机制3-viewgroup的分发流程move的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973741

相关文章

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Nginx之upstream被动式重试机制的实现

《Nginx之upstream被动式重试机制的实现》本文主要介绍了Nginx之upstream被动式重试机制的实现,可以通过proxy_next_upstream来自定义配置,具有一定的参考价值,感兴... 目录默认错误选择定义错误指令配置proxy_next_upstreamproxy_next_upst

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应