【Android14 ShellTransitions】(一)开篇

在这里插入图片描述

说来惭愧,AndroidU都已经开发这么久了,但是我还没有整理过ShellTransition相关的知识。我本来希望能够系统的写一篇关于ShellTransition的笔记出来,但是发现一来这是一个比较庞大的模块,二来我个人能力有限,对ShellTransition目前掌握的并不透彻,只是朦胧上大体有一个认知。如果把ShellTransition的方方面面都了解清楚再去写这么一篇笔记,google说不定已经不用ShellTransition了,就像我刚刚弄清楚AppTransition和AppTransitionController这块的逻辑,AndroidU就把动画逻辑变成ShellTransition了一样,有点不讲武德了。所以趁ShellTransition还健在,我觉得还是趁热打铁吧,哪天看了ShellTransition的代码有点感悟了就去做相关记录,这样做的缺点就是知识点比较零散,写的会比较随意,并且也可能有理解的不到位的地方,但是希望可以靠后面的持续更新来慢慢改善这些不足,总比ShellTransition坟头草都三米高了才想起来要总结要好。

废话就到这里,现在开始吧。

ShellTransition相关类

网上关于ShellTransition的介绍还是比较少的,这个时候想要立刻能够对ShellTransition有一个大概认知,我一般会看注释,所以这里也是先看ShellTransition相关的类的注释。

1 TransitionController

首先是TransitionController,它有点像之前的AppTransitionController,是WMCore这边的动画的控制器调度器之类的,控制动画的生命周期。

另外一提,这里有一个WMCore和WMShell的新概念,似乎是和这些的类的包名有关,比如TransitionController这个类,它的目录为:

frameworks\base\libs\WindowManager\Shell\src\com\android\wm\shell\transition\Transitions.java

包名为:com.android.server.wm

它被归纳为WMCore里的。

而下面的Transitions类,它的目录为:

frameworks\base\libs\WindowManager\Shell\src\com\android\wm\shell\transition\Transitions.java

包名为:com.android.wm.shell.transition

它被归纳为WMShell里的。

好了,继续看TransitionController的注释:

/*** Handles all the aspects of recording (collecting) and synchronizing transitions. This is only* concerned with the WM changes. The actual animations are handled by the Player.** Currently, only 1 transition can be the primary "collector" at a time. This is because WM changes* are still performed in a "global" manner. However, collecting can actually be broken into* two phases:*    1. Actually making WM changes and recording the participating containers.*    2. Waiting for the participating containers to become ready (eg. redrawing content).* Because (2) takes most of the time AND doesn't change WM, we can actually have multiple* transitions in phase (2) concurrently with one in phase (1). We refer to this arrangement as* "parallel" collection even though there is still only ever 1 transition actually able to gain* participants.** Parallel collection happens when the "primary collector" has finished "setup" (phase 1) and is* just waiting. At this point, another transition can start collecting. When this happens, the* first transition is moved to a "waiting" list and the new transition becomes the "primary* collector". If at any time, the "primary collector" moves to playing before one of the waiting* transitions, then the first waiting transition will move back to being the "primary collector".* This maintains the "global"-like abstraction that the rest of WM currently expects.** When a transition move-to-playing, we check it against all other playing transitions. If it* doesn't overlap with them, it can also animate in parallel. In this case it will be assigned a* new "track". "tracks" are a way to communicate to the player about which transitions need to be* played serially with each-other. So, if we find that a transition overlaps with other transitions* in one track, the transition will be assigned to that track. If, however, the transition overlaps* with transition in >1 track, we will actually just mark it as SYNC meaning it can't actually* play until all prior transition animations finish. This is heavy-handed because it is a fallback* situation and supporting something fancier would be unnecessarily complicated.*/
class TransitionController

处理记录(收集)和同步Transition的所有方面。 这仅涉及WM更改。 实际的动画由Player处理。

目前,一次只能有 1 个Transition成为主要“收集器”。 这是因为 WM 更改仍然以“全局”方式执行。 然而,收集实际上可以分为两个阶段:

1. 实际进行WM更改并记录参与的容器。

2. 等待参与容器准备就绪(例如重绘内容)。

因为 (2) 花费了大部分时间并且不会改变 WM,所以我们实际上可以在阶段 (2) 中同时进行多个Transition,同时在阶段 (1) 中进行一个Transition。 我们将这种安排称为“并行”收集,尽管实际上仍然只有 1 个Transition能够获得参与者。

当“主收集器”完成“设置”(第 1 阶段)并等待时,会发生并行收集。 此时,另一个Transition可以开始收集。 发生这种情况时,第一个Transition将移至“等待”列表,新Transition将成为“主收集器”。 如果在任何时候,“主收集器”在其中一个等待Transition之前开始播放,则第一个等待Transition将变回“主收集器”。 这维持了 WM 其余部分当前所期望的“全局”抽象。

当一个Transition移动到播放时,我们会根据所有其他播放Transition进行检查。 如果它不与它们重叠,它也可以并行动画。 在这种情况下,它将被分配一个新的“轨道”。 “轨道”是一种与Player沟通哪些Transition需要彼此串行播放的方式。 因此,如果我们发现一个Transition与一个轨道中的其他Transition重叠,则该Transition将被分配给该轨道。 但是,如果Transition与 大于1个轨道中的Transition重叠,我们实际上会将其标记为 SYNC,这意味着在所有先前的Transition动画完成之前它无法实际播放。 这是一种笨拙的做法,因为这是一种后备情况,支持更高级的东西会变得不必要的复杂。

2 Transitions

/*** Plays transition animations. Within this player, each transition has a lifecycle.* 1. When a transition is directly started or requested, it is added to "pending" state.* 2. Once WMCore applies the transition and notifies, the transition moves to "ready" state.* 3. When a transition starts animating, it is moved to the "active" state.** Basically: --start--> PENDING --onTransitionReady--> READY --play--> ACTIVE --finish--> |*                                                            --merge--> MERGED --^** The READY and beyond lifecycle is managed per "track". Within a track, all the animations are* serialized as described; however, multiple tracks can play simultaneously. This implies that,* within a track, only one transition can be animating ("active") at a time.** While a transition is animating in a track, transitions dispatched to the track will be queued* in the "ready" state for their turn. At the same time, whenever a transition makes it to the* head of the "ready" queue, it will attempt to merge to with the "active" transition. If the* merge succeeds, it will be moved to the "active" transition's "merged" list and then the next* "ready" transition can attempt to merge. Once the "active" transition animation is finished,* the next "ready" transition can play.** Track assignments are expected to be provided by WMCore and this generally tries to maintain* the same assignments. If, however, WMCore decides that a transition conflicts with >1 active* track, it will be marked as SYNC. This means that all currently active tracks must be flushed* before the SYNC transition can play.*/
public class Transitions

播放Transition动画。 在这个Players中,每个Transition都有一个生命周期。

1. 当直接启动或请求Transition时,将其添加到“PENDING ”状态。

2. 一旦 WMCore 应用Transition并发出通知,Transition就会转至“READY ”状态。

3. 当Transition开始动画时,它会转至“ACTIVE ”状态。

基本上:–start–> PENDING --onTransitionReady–> READY --play–> ACTIVE --finish–> --merge–> MERGED –

READY 及以后的生命周期按“轨道”进行管理。 在一个轨道中,所有动画都按描述的方式串行排列; 但是,多个轨道可以同时播放。 这意味着,在一个轨道内,一次只能有一个Transition处于动画状态(“ACTIVE ”)。

当一个Transition在一个轨道中进行动画时,分派到该轨道的Transition将以“READY ”状态排队等待轮到。 同时,每当Transition到达“READY ”队列的头部时,它将尝试与“ACTIVE ”Transition合并。 如果合并成功,它将被移动到“ACTIVE ”Transition的“合并”列表,然后下一个“READY ”Transition可以尝试合并。 一旦“ACTIVE ”过渡动画完成,就可以播放下一个“READY ”Transition。

轨道分配预计由 WMCore 提供,这通常会尝试保持相同的分配。 但是,如果 WMCore 确定Transition与大于1个活动轨道冲突,则会将其标记为 SYNC。 这意味着在 SYNC Transition可以播放之前,必须刷新所有当前活动的轨道。

3 Transition

/*** Represents a logical transition. This keeps track of all the changes associated with a logical* WM state -> state transition.* @see TransitionController** In addition to tracking individual container changes, this also tracks ordering-changes (just* on-top for now). However, since order is a "global" property, the mechanics of order-change* detection/reporting is non-trivial when transitions are collecting in parallel. See* {@link #collectOrderChanges} for more details.*/
class Transition implements BLASTSyncEngine.TransactionReadyListener

代表一个逻辑转换。这会跟踪与逻辑WM状态->状态转换相关的所有更改。

除了跟踪单个容器更改之外,这还跟踪排序更改(目前仅在顶部)。然而,由于顺序是一个“全局”属性,当转换并行收集时,顺序更改检测/报告的机制并不简单。

4 小结

看了注释其实还是挺懵b的,重点看下这块:

start–> PENDING --onTransitionReady–> READY --play–> ACTIVE --finish–> --merge–> MERGED

这里说下我个人的理解。

首先Transition是有一个状态集的:

在这里插入图片描述

  • STATE_PENDING,当Transition刚被创建的时候就是这个状态。
  • STATE_COLLECTING,当Transition开始收集动画参与者的时候,就会被置为这个状态。
  • STATE_STARTED,Transition已经被正式启动,它仍在收集中,但一旦所有参与者准备好进行动画(完成绘制),它将停止。结合STATE_COLLECTING,这里的意思应该就是说,如果Transition没有被start,那么它将一直处于收集参与者的状态,及时所有参与者都已经完成绘制可以开始动画了,但是因为当前Transition没有被启动,所以也无法进行下一步。
  • STATE_PLAYING,Transition正在执行动画,并且不能再继续收集了,也不能被改变。也就是说此时谁谁谁要执行动画已经确定了,并且这些参与者已经开始进行动画了,所以就不能再去收集新的参与者了,而且也不能对当前Transition进行修改了。
  • STATE_FINISHED,Transition已经成功执行完了动画。
  • STATE_ABORTED,Transition正在被中止或者已经中止,不会执行任何动画,也不会将任何内容发给player。

看到其实代码中是没有定义注释中说的那些READY、MERGED的状态的。

我们主要关注除STATE_ABORT的状态,既然是状态,那一般就是某段时间中Transition所处的一个状态,Transition一直处于这种状态,直到某个时间点发生了一些标志性事件,导致了Transition进入下一个状态。

1)、创建Transition,Transition的最初状态,STATE_PENDING状态。

2)、moveToCollecting,Transition进入STATE_COLLECTING状态。

3)、requestStartTransition,Transition进入STATE_STARTED状态。

4)、onTransitionReady,Transition进入STATE_PLAYING状态。

5)、finishTransition ,Transition进入STATE_FINISHED状态。

接下来我们以在Launcher界面点击App图标启动某个App为例,来分析一般过程,但是无法面面俱到,一些细节希望靠后续的系列文章可以补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

插件“猫抓”使用方法 - 浏览器下载m3u8视频 - 合并 - 视频检测下载 - 网课下载神器

前言 浏览器下载m3u8视频 - 合并 - 网课下载神器 chrome插件-猫抓 https://chrome.zzzmh.cn/info/jfedfbgedapdagkghmgibemcoggfppbb 步骤: P.s. 推荐大佬的学习视频! 《WEB前端大师课》超级棒! https://ke.qq.com/course/5892689#term_id…

discuzX2.5的使用心得 札记一

从开始接受php论坛的开发任务,对php感兴趣的我开始迷恋上discuz这个产品了, 像戴志康这样的创新人才,是我们这代人的骄傲和学习的榜样 应该是了解一下,啥事discuzX2.5,百度看一下 discuz x2.5_百度百科 看完百度词条…

C语言 | Leetcode C语言题解之第101题对称二叉树

题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSymmetric(struct TreeNode* root) {if (root NULL) return true;//如果根为空直接…

selenium 爬取今日头条

由于今日头条网页是动态渲染,再加上各种token再验证,因此直接通过API接口获取数据难度很大,本文使用selenium来实现新闻内容爬取。 selenium核心代码 知识点: 代码中加了很多的异常处理,保证错误后重试,…

SerDes系列之CTLE均衡技术

CTLE(连续时间线性均衡)是一种施加在接收器上的线性模拟高通滤波器,通过衰减低频信号分量,以补偿奈奎斯特频率附近的衰减比例,从而实现信道补偿。当低频信号分量向下衰减并推入底噪范围时,CTLE就会失去调节…

C#利用WinForm实现可以查看指定目录文件下所有图片

目录 一、关于Winform 二、创建应用 三、功能实现 四、代码部分 一、关于Winform Windows 窗体是用于生成 Windows 桌面应用的 UI 框架。 它提供了一种基于 Visual Studio 中提供的可视化设计器创建桌面应用的高效方法。 利用视觉对象控件的拖放放置等功能,可…

支付风险智能风控应用与评估指引

伴随宏观经济环境变化、支付监管愈趋从严、金融科技不断创新、支付参与主体日趋多元,支付行业正面临着业务发展与合规经营、支付便捷与安全、数据挖掘与隐私保护等诸多挑战,支付风险的复杂性与日俱增,共同建设安全支付生态的必要性不断凸显&a…

flannel详细介绍

一、前言 Flannel 是一个简单、高效的容器网络解决方案,适用于需要在多个主机上运行容器的场景。它通过虚拟网络技术和 IP 地址管理来实现容器之间的通信和跨主机连接,为容器平台提供了可靠的网络基础设施,flannel有三种模式,分别…

14、24年--信息系统管理——管理方法

主要考选择题,2分左右,案例涉及的概率很低,论文写作不会单独考。 1、管理基础 1.1 层次结构 信息系统是对信息进行采集、处理、存储、管理和检索,形成组织中的信息流动和处理,必要时能向有关人员提供有用的信息的系统。它是由人、技术、流程和数据资源组成的人机系统,目…

【Python】—— 公共的方法

目录 (一)公共操作 1.1 公共操作之运算符加号 1.2 公共操作之运算符乘号 1.3 公共操作之运算符判断数据是否存在 (二)公共方法 2.1 公共方法-len 2.2 公共方法-del 2.3 公共方法-max和min 2.4 公共方法-range 2.5 公共方…

Potree点云手册

兄弟们整理和收集资料不容易,请关注手册!! Potree 以其高显示速度而脱颖而出,使其成为处理大量点云数据集的绝佳选择。 我们的重点将是 Potree 提供的多样化导航和显示选项。 如果你遇到任何问题,请随时尝试其他浏览器…

算法2:滑动窗口(上)

文章目录 长度最小子数组无重复字符的最长子串[最大连续 1 的个数III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)将x减到0的最小操作数 长度最小子数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {in…

聚观早报 | 拼多多第一季度营收;苹果2024款彩虹表带上市

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月24日消息 拼多多第一季度营收 苹果2024款彩虹表带上市 小米汽车智驾将提速 iPhone 16 Pro Max将用最大屏幕 …

【hive和spark】hive on spark和spark读取hive metastore配置

HIVE ON SPARK 和 SPARK READ HIVE METASTORE 具体hadoop 和 hive单机版本安装请参考单节点搭建hadoop和hive 此文是基与这篇基础上升级而来。 零、版本说明&#xff1a; 本例使用的版本&#xff0c;hive和spark版本对标Cloudera 公司的 cdh6.2.0 版本&#xff0c;hdfs图省事…

vscode 插件开发指南

1安装nodejs、vscode 2安装插件脚手架 npm install -g yo generator-code 3使用命令创建插件项目 yo code 4在vscode中打开项目 5运行调试&#xff0c;按F5键 6在新打开的窗口中按shiftctrlp 然后执行命令 7配置右键菜单命令 遇到问题&#xff1a; 1.package.json中vsc…

高性能负载均衡的分类及架构分析

如何选择与部署适合的高性能负载均衡方案&#xff1f; 当单服务器性能无法满足需求&#xff0c;高性能集群便成为提升系统处理能力的关键。其核心在于通过增加服务器数量&#xff0c;强化整体计算能力。而集群设计的挑战在于任务分配&#xff0c;因为无论在哪台服务器上执行&am…

STM32_HAL_RTC时钟

1. RTC 时钟简介 STM32F407 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相对应的软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统的当前时间和日期。 RTC 模块和时钟配…

2024年电工杯数学建模A题思路分享 - 园区微电网风光储协调优化配置

# 1 赛题 A 题&#xff1a; 园区微电网风光储协调优化配置 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;为了尽量提高风光电量的 负荷占比&#xff0c;需配置较高比例的风光发电装机容量&#xff0c;但由于园区负荷与风光发电功 率时序不匹配&#xff0c; 可能导致…

SaToken+SpringBoot+Redis前后端分离登录认证

目录 前言一、创建工程项目&#x1f38d;1.1 创建后端工程1.2 创建前端工程 二、业务代码&#x1f38a;后端代码前端代码 三、测试参考资料 前言 Sa-Token 是一款 Java 语言的权限认证框架&#xff0c;提供了灵活、高效、易用的权限认证和会话管理功能。它是 SpringBoot、Spri…

华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇

本文作者&#xff1a;郑岩&#xff08;华为云AI变革首席专家&#xff09;全文约3313字&#xff0c;阅读约需8分钟&#xff0c;请仔细看看哦~ 前阵子&#xff0c;我在公司内部发了一篇Sora的科普贴&#xff0c;本来只是个简单的技术总结&#xff0c;但让我意外的是&#xff0c;…