android 动画原理分析

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.lambdanew8$DisplayContent(DisplayContent.java:884)

01-01 14:48:34.775 1039 1153 I yang111 : at com.android.server.wm.-$$LambdaDisplayContentqxt4izS31fb0LF2uo_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.-$$LambdaSurfaceAnimationRunner9Wa9MhcrSX12liOouHtYXEkDU60.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)

相关推荐
RisunJan13 分钟前
Android 高频面试题与解答
android
MyBili19 分钟前
【安卓开发/搞机】快图浏览(QuickPic)技术解析:为何这款3MB应用仍是本地图库的性能天花板?
android·app·安卓·文件管理·相册·看图软件·手机相册
事圆则缓1 小时前
Kotlin 高阶工程化与 Android 深入实践
android·开发语言·kotlin
zhangphil1 小时前
AI大模型生成maxTokens 与上下文context
android·llama
淡淡的香烟1 小时前
Androidiot开发之猫脸识别
android·物联网
2501_915106321 小时前
iOS数据采集技术详解:从性能监控到崩溃分析的全链路实践
android·ios·小程序·https·uni-app·iphone·webview
天空之城--10 小时前
Android Koin 完全指南:从原理到实践
android
zhangphil11 小时前
Android main thread主线程Choreographer doFrame发生FullSuspendCheck
android
TimeFine15 小时前
智能眼镜开发:获取真实的音频路由
android
pengyu15 小时前
【Kotlin 协程修仙录 · 渡劫境 · 中阶】 | 造化神兵:自定义 CoroutineDispatcher 与调度器的终极定制
android·kotlin