android 动画原理分析

news/2024/11/21 19:05:06/


android 动画分为app内的view动画和系统动画
基本原理都是监听Choreographer的doframe回调


app端的实现是主要通过AnimationUtils来实现具体属性的变化通过invilate来驱动
wms来进行更新。这个流程是在app进程完成

这里不是我分析的重点
直接来看下系统动画里面的本地动画:app启动动画,这个流程是在系统进程完成
这里分成三个部分的流程:
动画的触发,动画的加载,动画的启动,动画的关闭。

这里大概写下流程,下面有具体的调用堆栈
1 触发 ams.attachapplicaton---activitystack.minimalresumeactivitylocked---rootwindowcontainner--displaycontent
---wms.requestTraversal--mService.mAnimationHandler.post(mPerformSurfacePlacement);(post 一个runnable消息给wms)

2 启动
---rootwindowcontainer---performsurfaceplacementnotrace------apptransitioncontroller.applyanimations---
---windowcontainer.applyanimationunchecked -----surfaceanimator.startanimation--(创建leash然后Transaction.reparent(surface,leash))
---localanimationadapter(animationadapter的父类)---surfaceanimationrunner.startanimation--mChoreographer.postFramecallback
3 关闭
  windowcontainer循环完后,调用wms的onAnimationfinished。

详细动画执行流程
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.SurfaceAnimationRunner.startAnimation(SurfaceAnimationRunner.java:139)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.LocalAnimationAdapter.startAnimation(LocalAnimationAdapter.java:55)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:160)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2128)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowState.startAnimation(WindowState.java:5222)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowState.startMoveAnimation(WindowState.java:5218)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowState.handleWindowMovedIfNeeded(WindowState.java:2090)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.DisplayContent.lambda$new$8$DisplayContent(DisplayContent.java:884)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc.accept(Unknown Source:4)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:2003)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:1993)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:4672)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowState.forAllWindows(WindowState.java:4571)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1310)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.ActivityRecord.forAllWindowsUnchecked(ActivityRecord.java:3632)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.ActivityRecord.forAllWindows(ActivityRecord.java:3627)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1310)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1310)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1310)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.TaskDisplayArea.forAllWindows(TaskDisplayArea.java:511)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1310)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1310)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1310)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1327)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.DisplayContent.applySurfaceChangesTransaction(DisplayContent.java:4010)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.RootWindowContainer.applySurfaceChangesTransaction(RootWindowContainer.java:1074)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:854)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:811)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:178)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:127)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:116)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.DisplayContent.layoutAndAssignWindowLayersIfNeeded(DisplayContent.java:3384)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:5268)
01-01 14:48:34.775  1039  1153 I yang111 :     at android.os.Handler.dispatchMessage(Handler.java:106)
01-01 14:48:34.775  1039  1153 I yang111 :     at android.os.Looper.loop(Looper.java:223)
01-01 14:48:34.775  1039  1153 I yang111 :     at android.os.HandlerThread.run(HandlerThread.java:67)
01-01 14:48:34.775  1039  1153 I yang111 :     at com.android.server.ServiceThread.run(ServiceThread.java:44)

二 动画执行循环流程
01-01 14:39:38.477  1079  1150 I yang    :     at com.android.server.wm.SurfaceAnimationRunner.startAnimationLocked(SurfaceAnimationRunner.java:182)
01-01 14:39:38.477  1079  1150 I yang    :     at com.android.server.wm.SurfaceAnimationRunner.startPendingAnimationsLocked(SurfaceAnimationRunner.java:173)
01-01 14:39:38.477  1079  1150 I yang    :     at com.android.server.wm.SurfaceAnimationRunner.startAnimations(SurfaceAnimationRunner.java:248)
01-01 14:39:38.477  1079  1150 I yang    :     at com.android.server.wm.SurfaceAnimationRunner.lambda$9Wa9MhcrSX12liOouHtYXEkDU60(Unknown Source:0)
01-01 14:39:38.477  1079  1150 I yang    :     at com.android.server.wm.-$$Lambda$SurfaceAnimationRunner$9Wa9MhcrSX12liOouHtYXEkDU60.doFrame(Unknown Source:2)
01-01 14:39:38.477  1079  1150 I yang    :     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:970)
01-01 14:39:38.477  1079  1150 I yang    :     at android.view.Choreographer.doCallbacks(Choreographer.java:796)
01-01 14:39:38.477  1079  1150 I yang    :     at android.view.Choreographer.doFrame(Choreographer.java:727)
01-01 14:39:38.477  1079  1150 I yang    :     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
01-01 14:39:38.477  1079  1150 I yang    :     at android.os.Handler.handleCallback(Handler.java:938)
01-01 14:39:38.477  1079  1150 I yang    :     at android.os.Handler.dispatchMessage(Handler.java:99)
01-01 14:39:38.477  1079  1150 I yang    :     at android.os.Looper.loop(Looper.java:223)
01-01 14:39:38.477  1079  1150 I yang    :     at android.os.HandlerThread.run(HandlerThread.java:67)
01-01 14:39:38.477  1079  1150 I yang    :     at com.android.server.ServiceThread.run(ServiceThread.java:44)


http://www.ppmy.cn/news/1548831.html

相关文章

Linux进阶:压缩、解压

压缩、解压 Linux和Mac系统通常有2种压缩格式,后缀名分别是: .tar,称之为tarball,归档文件,即简单的将文件组装到一个.tar的文件内,并没有太多文件体积的减少,仅仅是简单的封装 .gz&#xff0…

Android Framework PMS面试题及参考答案

什么是 Package Manager Service(PMS)? Package Manager Service(PMS)是 Android 系统中一个核心的系统服务。它运行在系统的后台,主要负责系统中所有应用程序包(APK)的管理和维护工作。从本质上讲,它是一个在 Android 操作系统框架层发挥关键作用的服务组件。 它在 A…

【Python】30个Python爬虫的实战项目!!!(附源码)

Python爬虫是数据采集自动化的利器。本文精选了30个实用的Python爬虫项目,从基础到进阶,每个项目都配有完整源码和详细讲解。通过这些项目的实战,可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…

iw添加wlan0导致crash问题分析

比如通过日下命令&#xff0c;创建一个wlan0接口 iw phy phy0 interface add wlan0 type managed 会产生如下panic内容 <1> [54245.466372] Unable to handle kernel NULL pointer dereference at virtual address 00000010 <1> [54245.474729] pgd c1794000 &…

【传知代码】VRT_ 关于视频修复的模型

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ VRT_ 关于视频修复的模型 背景介绍&#xff1a;重要性&#xff1a; VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 视…

LabVIEW中的UDP与TCP比较

在LabVIEW中&#xff0c;UDP和TCP可以用于不同的网络通信场景&#xff0c;开发者可以根据需求选择合适的协议。以下是结合LabVIEW开发时的一些比较和应用场景&#xff1a; 1.TCP在LabVIEW中的应用&#xff1a; 可靠性高的场景&#xff1a;当开发一个对数据传输的准确性和完整…

用Python“拍立淘”:在1688的海洋里寻找宝藏

想象一下&#xff0c;你是一名勇敢的探险家&#xff0c;手持一张神秘的藏宝图&#xff0c;准备在阿里巴巴的1688海洋中寻找那些隐藏的宝贝。但这次&#xff0c;你的武器不是传统的铲子和罗盘&#xff0c;而是Python爬虫。我们将一起编写一段代码&#xff0c;让它成为我们的“拍…

【AI系统】核心计算之矩阵乘

核心计算之矩阵乘 AI 模型中往往包含大量的矩阵乘运算&#xff0c;该算子的计算过程表现为较高的内存搬移和计算密度需求&#xff0c;所以矩阵乘的效率是 AI 芯片设计时性能评估的主要参考依据。本文我们一起来看一下矩阵乘运算在 AI 芯片的具体过程&#xff0c;了解它的执行性…