当前位置: 首页 > news >正文

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.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)

相关文章:

android 动画原理分析

一 android 动画分为app内的view动画和系统动画 基本原理都是监听Choreographer的doframe回调 二 app端的实现是主要通过AnimationUtils来实现具体属性的变化通过invilate来驱动 wms来进行更新。这个流程是在app进程完成 这里不是我分析的重点 直接来看下系统动画里面的本地动…...

Elasticsearch 6.8 分析器

在 Elasticsearch 中,分析器(Analyzer)是文本分析过程中的一个关键组件,它负责将原始文本转换为一组词汇单元(tokens)。 分析器由三个主要部分组成:分词器(Tokenizer)、…...

实验室资源调度系统:基于Spring Boot的创新

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1:完成网络部署 2、任务 2:设计全网 IP 地址 3、任务 3:实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …...

3. SQL优化

SQL性能优化 在日常开发中,MySQL性能优化是一项必不可少的技能。本文以具体案例为主线,结合实际问题,探讨如何优化插入、排序、分组、分页、计数和更新等操作,帮助你实现数据库性能的飞跃。 一、索引设计原则 索引是MySQL优化的…...

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码, $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是:从 $file_name 中去除所有出现在 $deny_ext 数组中的元素,替换为空字符串(即删除这些元素)。str_ireplace() 在处理时…...

AWS CLI

一、AWS CLI介绍 1、简介 AWS CLI(Amazon Web Services Command Line Interface)是一个命令行工具,它允许用户通过命令行与 Amazon Web Services(AWS)的各种云服务进行交互和管理。使用 AWS CLI,用户可以直接在终端或命令行界面中执行命令来配置、管理和自动化AWS资源,…...

springboot:责任链模式实现多级校验

责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。 当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。 属于行为型模式…...

CentO7安装单节点Redis服务

本文目录 一、Redis安装与配置1.1 安装redis依赖1.2 上传压缩包并解压1.3 编译安装1.4 修改配置并启动1、复制配置文件2、修改配置文件3、启动Redis服务4、停止redis服务 1.5 redis连接使用1、 命令行客户端2、 图形界面客户端 一、Redis安装与配置 1.1 安装redis依赖 Redis是…...

FreeRTOS学习14——时间管理

时间管理 时间管理FreeRTOS 系统时钟节拍FreeRTOS 系统时钟节拍简介FreeRTOS 系统时钟节拍处理FreeRTOS 系统时钟节拍来源 FreeRTOS 任务延时函数vTaskDelay()vTaskDelayUntil() 时间管理 在前面的章节实验例程中,频繁地使用了 FreeRTOS 提供的延时函数&#xff0c…...

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回? 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维。 优点: 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本,因为所有接⼝都…...

Python学习------第十天

数据容器-----元组 定义格式,特点,相关操作 元组一旦定义,就无法修改 元组内只有一个数据,后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…...

Win11 24H2新BUG或影响30%CPU性能,修复方法在这里

原文转载修改自(更多互联网新闻/搞机小知识): 一招提升Win11 24H2 CPU 30%性能,小BUG大影响 就在刚刚,小江在网上冲浪的时候突然发现了这么一则帖子,标题如下:基准测试(特别是 Time…...

element ui 走马灯一页展示多个数据实现

element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作,先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…...

40分钟学 Go 语言高并发:Goroutine基础与原理

Day 03 - goroutine基础与原理 1. goroutine创建和调度 1.1 goroutine基本特性 特性说明轻量级初始栈大小仅2KB,可动态增长调度方式协作式调度,由Go运行时管理创建成本创建成本很低,可同时运行数十万个通信方式通过channel进行通信&#x…...

Figma插件指南:12款提升设计生产力的插件

在当今的设计领域,Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展,这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件,帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…...

【K8S系列】Kubernetes集群资源管理与调度 深度分析

在现代微服务架构中,Kubernetes(K8s)作为容器编排平台,提供了强大的资源管理和调度能力。然而,随着应用规模的扩大和复杂性增加,如何高效地管理和调度集群资源成为一个关键挑战。本文将深入探讨 Kubernetes…...

delphi fmx android 离线人脸识别

搜遍全网都没有找到delphi android 能用的 离线人脸识别,无需注册什么开发者 有这方面需求的可以用fsdk 这边用的luxand.FSDK8.0 android下的注册号要自己找下 1,用老猫的工具将android 下的sdk,FSDK.java 编译成FSDK.jar 老猫的工具 2,用上面的工具将FSDK.jar 生成de…...

Linux mountpoint 命令详解

前言 在 Linux 系统中,文件系统管理是一个非常重要的任务。mountpoint 是一个常用的小工具,用于检查目录是否是挂载点。本篇博客将详细介绍 mountpoint 命令的用法及其在日常系统管理中的应用。 什么是挂载点? 挂载点是一个目录&#xff0…...

Linux驱动开发(9):pinctrl子系统和gpio子系统--led实验

在前面章节,我们有过使用寄存器去编写字符设备的经历了。这种直接在驱动代码中, 通过寄存器映射来对外设进行使用的编程方式,从驱动开发者的角度可以说是灾难。 因为每当芯片的寄存器发生了改动,那么底层的驱动几乎得重写。 那么…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...