【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,但是真正将动画参与者收集进来则是之后的事情了,有可能马上就收集到了动画参与者(比如接下来我们要分析的),也可能后续陆陆续续收集到了多个动画参与者。

相关推荐
crmscs10 分钟前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob12 分钟前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔17 分钟前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99617 分钟前
flutter和Android动画的对比
android·flutter·动画
lxysbly2 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首3 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19435 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs6 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&6 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
LDORntKQH6 小时前
基于深度强化学习的混合动力汽车能量管理策略 1.利用DQN算法控制电池和发动机发电机组的功率分配 2
android