事件分发机制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

相关文章

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c