【Android14 ShellTransitions】(三)Transition移动为COLLECTING状态

这一节的内容在WMCore中,Transition进入到第二个状态,COLLECTING状态。

我们看到在上一节ActivityStarter.startActivityUnchecked启动Activity的流程中,调用了TransitionController.createAndStartCollecting来创建一个Transition对象:

创建完Transition后,接着调用了TransitionController.moveToCollecting方法:

该方法的主要内容为:

1)、将TransitionController.mCollectingTransition赋值为传参Transition,TransitionController.mCollectingTransition定义为:

代表了处于收集状态的Transition,一般情况下,在没有排队的情况下,TransitionController.mCollectingTransition就是在此方法下被赋值的。

2)、调用Transition.startCollecting方法:

首先将当前Transition的状态标记为STATE_COLLECTING,接着通过BLASTSyncEngine.startSyncSet方法,创建一个SyncGroup,用来收集动画的参与者。

SyncGroup简介

SyncGroup的相关内容我们在以前WindowContainerTransaction系列文章中那篇关于BLASTSyncEngine里其实已经比较细致的讲过了,不过这里还是再看下。

接下来看下BLASTSyncEngine.startSyncSet方法的内容:

其实还是比较清晰的:

1)、调用BLASTSyncEngine.prepareSyncSet来创建一个SyncGroup,这里能看到BLASTSyncEngine是用一个全局的成员变量mNextSyncId通过自增来生成SyncGroup的ID的,因此SyncGroup的ID是逐渐变大的,自然也不会出现重复的情况。

2)、调用BLASTSyncEngine.startSyncSet来将当前SyncGroup添加到成员变量mActiveSyncs中,成员变量mActiveSyncs的定义为:

用来跟踪现在有多少个SyncGroup在同时进行收集的操作。

另外看到BLASTSyncEngine.startSyncSet方法的最后,是将创建的SyncGroup的ID返回,并且赋值给Transition.mSyncId,这样Transition就可以通过传入其ID,来在BLASTSyncEngine中找到与其一一对应的那个SyncGroup了。

SyncGroup,顾名思义,就是一个同步集合,用来保存当前有哪些WindowContainer参与到了动画当中,因此一个关键的成员变量就是一个ArraySet类型的,保存了参与动画的WindowContainer的集合:

这里可以看到Transition走到PENDING状态只是表明,Transition被标记成为了那个唯一的可以收集动画参与者的Transition,但是真正将动画参与者收集进来则是之后的事情了,有可能马上就收集到了动画参与者(比如接下来我们要分析的),也可能后续陆陆续续收集到了多个动画参与者。

相关推荐
aningxiaoxixi21 分钟前
android AV 之 SimpleC2Component
android
TAEHENGV36 分钟前
导入导出模块 Cordova 与 OpenHarmony 混合开发实战
android·javascript·数据库
君莫啸ོ1 小时前
Android基础-SwitchCompat自定义样式
android
5980354151 小时前
【java工具类】小数、整数转中文小写
android·java·开发语言
csj501 小时前
安卓基础之《(8)—中级控件(2)选择按钮》
android
液态不合群1 小时前
【面试题】MySQL 中的索引数量是否越多越好?为什么?
android·数据库·mysql
QING6182 小时前
Kotlin协程:Job.cancel() 和 Scope.cancel() 的区别详解!!!
android·kotlin·android jetpack
Zender Han2 小时前
Flutter 图片裁剪插件 image_cropper 最新版介绍与使用教程
android·flutter·ios
方白羽3 小时前
Android 与 iOS 动态更换应用图标实现方案
android·ios·app
nono牛3 小时前
MTK平台Android init.rc服务详解实例
android·gitee