AOSP Android14 Launcher3——点击桌面图标启动应用动画流程

在Launcher3中,点击桌面应用图标时,会有一个从 图标位置起始到全屏的动画过程,使得应用的打开过程不是生硬的启动过程。

这个动画具体是怎么实现的呢?本文对这个过程进行一个梳理

在Launcher中,动画大体上可以分为两类,一种是Launcher3本身的动画,对Launcher3中的UI元素进行动画;还有一类是远程窗口的动画,也就是跨进程的动画。在启动应用,从应用回到Launcher,分屏,壁纸等等场景,使用的动画就是这类远程窗口动画。这类动画都会涉及到SystemUI,其中有几个核心接口类RemoteAnimationRunnerCompat,RemoteAnimationTargetCompat,整体动画过程是一个涉及到Launcher、WM、SystemUI等多个模块的过程。下面就来介绍详细的动画流程。

详细动画流程:

  1. 点击与启动请求:

    • 用户点击桌面图标 (BubbleTextViewFolderIcon)。
    • ItemClickHandler 或 View 自身的 onClick 触发。
    • 构建 Intent 并调用 Launcher.startActivitySafely()
  2. 生成 ActivityOptions (由 QuickstepTransitionManager 主导):

    • Launcher.startActivitySafely() 调用 Launcher.getActivityLaunchOptions()
    • Launcher.getActivityLaunchOptions() 调用 QuickstepTransitionManager 实例的 getActivityLaunchOptions(View v) 方法
    • QuickstepTransitionManager.getActivityLaunchOptions:
      • 判断启动来源(这里是从桌面图标,isLaunchingFromRecents 返回 false)。
      • 创建一个 AppLaunchAnimationRunner (实现了 RemoteAnimationFactory 接口) 实例,并传入一个 RunnableList 用于动画结束后的回调。
      • 创建一个 LauncherAnimationRunner (实现了 RemoteAnimationRunnerCompat 接口),包装 AppLaunchAnimationRunner
      • 使用 ActivityOptions.makeRemoteAnimation(...) 创建 ActivityOptions,将 LauncherAnimationRunner 注册给系统,并指定动画预估时长 (APP_LAUNCH_DURATION) 和状态栏动画延迟 (statusBarTransitionDelay)。
      • 返回包含这些 ActivityOptionsActivityOptionsWrapper
    • 这个过程的核心是告诉系统:“启动这个应用,但请把动画控制权通过远程动画回调交给我 (Launcher)”。
  3. 系统准备与回调:

    • ActivityTaskManagerService 处理启动请求,准备应用进程和窗口。
    • WindowManager 在应用窗口就绪后,通过 Binder 回调在步骤 2 中注册的 LauncherAnimationRunner,最终调用到 AppLaunchAnimationRunner.onCreateAnimation 方法,并传递 RemoteAnimationTarget 数组。
  4. Launcher 执行动画 (QuickstepTransitionManager.AppLaunchAnimationRunner.onCreateAnimation):

    • 接收 Targets: onCreateAnimation 方法被调用,接收到代表各个窗口/Surface 的 RemoteAnimationTarget 数组 (包括 MODE_OPENING 的应用,MODE_CLOSING 的 Launcher,以及壁纸等)。
    • 判断启动类型: 代码确认启动源不是 Widget 或 Recents,执行图标启动逻辑。
    • 构建核心动画 (composeIconLaunchAnimator): 这是关键步骤,构建一个 AnimatorSet 来编排整个动画:
      • 链接状态机: 调用 mLauncher.getStateManager().setCurrentAnimation(anim); 将这个 AnimatorSet 注册给状态管理器,通常意味着 Launcher 会开始或已经处于 BACKGROUND_APP 状态。
      • 创建窗口动画 (getOpeningWindowAnimators): 这是最核心的部分,负责应用窗口从无到有、从小到大的动画:
        • 创建 FloatingIconView: 调用 FloatingIconView.getFloatingIconView(...),根据点击的图标 v 创建一个悬浮的、可变形的图标视图,并计算出它在 DragLayer 中的初始边界 (launcherIconBounds)。原始图标通常会被隐藏。
        • 计算动画参数 (AnimOpenProperties): 计算出动画所需的详细起止参数,包括:窗口裁剪区域 (从图标大小到全屏)、窗口位置/缩放 (从图标位置/大小到全屏)、浮动图标的位置/缩放 (与窗口同步)、浮动图标与窗口的 Alpha 透明度变化(浮动图标淡出、窗口淡入)、窗口圆角(从图标圆角到系统窗口圆角)、阴影等。
        • 创建主驱动动画 (ValueAnimator): 创建一个从 0 到 1 的 ValueAnimator,时长为 APP_LAUNCH_DURATION,使用 LINEAR 插值器,它驱动整个动画的进度。
        • 添加更新监听器 (MultiValueUpdateListener): 这是每一帧执行变换的地方:
          • 使用多个 FloatProp 实例(带有不同的插值器如 mOpeningXInterpolator, mOpeningInterpolator)根据主进度计算当前帧的精确属性值(位移 dX, dY,缩放 mIconScaleToFitScreen,Alpha mIconAlpha,窗口圆角 mWindowRadius,窗口裁剪 mCropRect* 等)。
          • 更新 FloatingIconView: 调用 floatingView.update(...),传入计算好的边界、Alpha、形状进度、圆角等,让浮动图标在视觉上匹配正在变化的“窗口”。
          • 应用 SurfaceControl.Transaction: 创建一个 SurfaceControl.Transaction。遍历 appTargets,对于 MODE_OPENING 的 Target (即正在打开的应用窗口):
            • 获取其 SurfaceControl (Leash)。
            • 计算 Matrix 来设置缩放和位移。
            • 调用 transaction.forSurface(target.leash) 获取 Surface 属性构建器。
            • 使用 .setMatrix(), .setWindowCrop(), .setAlpha() (通常是 1f - mIconAlpha.value,实现交叉淡入淡出), .setCornerRadius(), .setShadowRadius() 等方法设置当前帧的窗口属性。
          • 应用 Transaction: 调用 surfaceApplier.scheduleApply(transaction) 将这一帧的所有 Surface 变换提交给 SurfaceFlinger
        • 添加清理监听器:appAnimator 上添加 AnimatorListenerAdapter,在 onAnimationEnd 时释放 RemoteAnimationTarget (openingTargets.release()) 并可能恢复图标状态。
      • 创建 Launcher 内容退场动画 (getLauncherContentAnimator): 创建另一个 AnimatorSet 来并行地动画 Launcher 自身的 UI 元素(Workspace, Hotseat, QSB, ScrimView 等),通常是让它们缩小、淡出。源码显示它会根据 Launcher 当前状态 (ALL_APPS, OVERVIEW, NORMAL) 选择不同的元素和方式进行动画。如果 ENABLE_SCRIM_FOR_APP_LAUNCH 开启,还会动画 ScrimView 的背景色。
      • 组合动画: 将窗口动画 (getOpeningWindowAnimators 返回的) 和 Launcher 内容动画 (getLauncherContentAnimator 返回的) 添加到主 AnimatorSet (anim) 中,使它们协同播放。
      • 添加 JANK 追踪: 使用 addCujInstrumentation 添加卡顿监控。
      • 设置 Launcher 不可见: 如果 Launcher 窗口本身是 MODE_CLOSING Target,添加 mForceInvisibleListener,在动画期间强制 Launcher 视图不可见 (INVISIBLE_BY_APP_TRANSITIONS)。
    • 返回结果: AppLaunchAnimationRunner 通过 AnimationResult.setAnimation(...) 将构建好的主 AnimatorSet 返回给系统。
  5. 动画结束与清理 (不变):

    • 系统播放 AnimatorSet。动画结束时,onAnimationEnd 监听器被调用。
    • 清理 FloatingIconView,释放 SurfaceControl 资源,执行 mOnEndCallback 中的回调,Launcher 状态稳定在 BACKGROUND_APP。应用窗口完全可见并获得焦点。

总结:

QuickstepTransitionManager 通过其内部类 AppLaunchAnimationRunner 精确地实现了图标到应用的启动动画。核心在于 composeIconLaunchAnimator 方法,它协同了以下几个关键部分:

  1. FloatingIconView: 提供图标变形放大的视觉引导。
  2. SurfaceControl.Transaction: 在动画每一帧直接操控打开应用的窗口 Surface (Leash),改变其 Matrix (位置/缩放)、Crop、Alpha、圆角等属性,使其从模拟图标状态平滑过渡到全屏状态。
  3. getLauncherContentAnimator: 并行地将 Launcher 的 Workspace、Hotseat 等内容动画隐藏。
  4. StateManager: 将此动画与 Launcher 内部状态(通常是进入 BACKGROUND_APP)关联起来。

整个过程充分利用了远程动画和 SurfaceControl 的能力,实现了高性能、跨进程、视觉效果丰富且同步精确的启动过渡。

内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为新质生产力的代表,已成为中国经济新的增长点。报告从发展环境、资金投入、创新能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创新能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
数据集一个高质量的医学图像数据集,专门用于脑肿瘤的检测和分类研究以下是关于这个数据集的详细介绍:该数据集包含5249张脑部MRI图像,分为训练集和验证集。每张图像都标注了边界框(Bounding Boxes),并按照脑肿瘤的类型分为四个类别:胶质瘤(Glioma)、脑膜瘤(Meningioma)、无肿瘤(No Tumor)和垂体瘤(Pituitary)。这些图像涵盖了不同的MRI扫描角度,包括矢状面、轴面和冠状面,能够全面覆盖脑部解剖结构,为模型训练提供了丰富多样的数据基础。高质量标注:边界框是通过LabelImg工具手动标注的,标注过程严谨,确保了标注的准确性和可靠性。多角度覆盖:图像从不同的MRI扫描角度拍摄,包括矢状面、轴面和冠状面,能够全面覆盖脑部解剖结构。数据清洗与筛选:数据集在创建过程中经过了彻底的清洗,去除了噪声、错误标注和质量不佳的图像,保证了数据的高质量。该数据集非常适合用于训练和验证深度学习模型,以实现脑肿瘤的检测和分类。它为开发医学图像处理中的计算机视觉应用提供了坚实的基础,能够帮助研究人员和开发人员构建更准确、更可靠的脑肿瘤诊断系统。这个数据集为脑肿瘤检测和分类的研究提供了宝贵的资源,能够帮助研究人员开发出更准确、更高效的诊断工具,从而为脑肿瘤患者的早期诊断和治疗规划提供支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值