Android动画分析(ValueAnimator)

article/2025/8/21 20:57:36

动画创建

先看入口函数:
在这里插入图片描述

参数很熟悉了,具体看里面做了什么,其实也很简单,创建一个实例对象,并将参数设置到对象中。
第一个参数暂时先不看,看第二个参数,**anim.setObjectValues(values)**

在这里插入图片描述
重点是 valuesHolder.setObjectValues(values);
在这里插入图片描述
这里把输入的参数值传给了 KeyframeSet这个类,这个类很重要!
在这里插入图片描述
在KeyframeSet 里面,将所有的参数值保存到一个 Keyframe数组中,这个Keyframe可以类比Map,键值对保存参数值,其中key是fraction,也就是随时间变化的系数,但是这个里面是根据数组下标占总数的百分比来求得(这里面就存在一个隐藏坑,具体看《动画插值器源码分析》一文),value就是对应的参数值。

这就是一般创建动画时的执行流程,接着来看动画执行部分!

动画执行

先看入口函数:
在这里插入图片描述
其中的关键代码如下:
在这里插入图片描述

首先是开始执行动画,接着由于这个 **mSeekFraction** 值默认是-1 ,
因此后续会进入 setCurrentPlayTime(0);

先来看开始动画,如下图,重要的是进行了动画的初始化 initAnimation(); 。
在这里插入图片描述
进入该函数会发现主要是对value值进行了初始化。
在这里插入图片描述
初始化代码如下图:
在这里插入图片描述
可以看到初始化其实就是设置估值器,也就是 evaluator ,而这个是咱们经常自定义重写的关键类!

开启动画到这里基本就走完了,接着来看初始化动画值!也就是setCurrentPlayTime这个函数了,如下图:
在这里插入图片描述
其实他就是调用了之前经常看到的setCurrentFraction 这个函数,顾名思义,该函数就是设置当前的fraction(基于开始时间)。
在这里插入图片描述
其中的核心代码就是 animateValue(currentIterationFraction) 这一行,进入该函数可以看到第一行就出现了我们非常熟悉的东西——Interpolator , 这个东西可以由我们自定义改写其中的规则,当然系统也有写好的供我们使用,他的作用就是将 fraction 按照一定的规则算法改变,而这个fraction从上文可知是和value值一对一匹配的。
在这里插入图片描述
接着就是for循环执行 mValues[i].calculateValue(fraction) ,这行代码的作用就是根据fraction算出具体的动画属性值!如下图:
在这里插入图片描述
果然,看到了熟悉的 keyframe ,进去看看!代码很长,但是我还是全部贴出来了,因为都很重要!

这个函数前半部分对只有2个值的情况做了特殊优化,并且对于fraction 超出[0,1]范围的情况做了特殊处理,直接去边界值进行估值计算(这里面就存在一个隐藏坑,具体看 动画插值器源码分析 )!
在这里插入图片描述
后半部分代码的作用是从第二帧开始,每一帧的fraction和前一帧的fraction组成一个区域,根据传入的fraction在区域的百分比来执行动画插值,当然这个百分比也是可以通过咱们自己的 Interpolator拦截修改掉的!最后,将这两帧值和百分比fraction传入估值器进行估值!
在这里插入图片描述
到此,动画就开始执行了,接着看动画的具体执行!

动画刷新

大家知道Android系统的运行机制是一个无限循环的消息机制,不例外的动画也是一个消息刷新机制,Choreographer这个单词的意思是编舞者,顾名思义,负责动作画面的指导!动画的刷新机制就从这里开始触发!关键代码 doAnimationFrame(getProvider().getFrameTime());
在这里插入图片描述
进入该行代码,其中的关键代码是 callback.doAnimationFrame(frameTime);,而这个callback谁实现了呢?没错,就是 ValueAnimator
在这里插入图片描述
进入ValueAnimator的回调函数中,如下图,代码很长,我会截取其中的关键部分。
在这里插入图片描述
可以看到,代码的最后进到了这行代码: animateBasedOnTime(currentTime);
在这里插入图片描述
这里面首先会根据当前时间和开始时间来计算动画执行的fraction,但是这里需要注意的是如果你是无限循环动画的话,你的fraction有可能不会到1.0 或者0.0 (这里是另一个坑)!因为Android系统的Choreographer 这个函数是根据系统的VSYNC信号来触发的,而VSYNC的数值是和刷新率有关系的!而这个函数会约束fraction在[0,1]之间,却没有保证一定能够到达两端!

接着会先通知OnRepeat回调函数的执行!最后便是上文提到的动画属性值的计算!
在这里插入图片描述
到此,整个动画的基本流程已经梳理通畅了!可以愉快的编(写)代(八)码(哥)了!


http://chatgpt.dhexx.cn/article/aiY1FCji.shtml

相关文章

好看的android动画效果

这段时间看到一些比较好看的android动画效果,下面我就给大家一些我比较喜欢的动画效果,并附上源码希望对你们有用处。 1.很简单却很酷的粒子破碎效果 介绍: 实现思路 1.新建一个 Bean Particle,表示一个粒子对象;新…

Android 动画系列二之补间动画

1. 前言 Android三种动画中的第二种——补间动画(Tween),和帧动画不同,帧动画 是通过连续播放图片来模拟动画效果,而补间动画开发者只需指定动画开始,以及动画结束"关键帧", 而动画变化的"中间帧"…

Android动画大合集

android中的动画实现方式繁多,在项目中也经常用到动画,网上有很多人也都进行了一些总结,但是感觉还是零零散散,自己总结一下才能加深印象,以后有时间了,也可以从各个分类里进一步去补充完善。 如果喜欢看G…

Android中动画详细讲解

一、前言 Android动画经常会在切换activity、数据加载时会用到动画效果,以前接触的比较少,用的都是封装好的动画效果,自己写的比较少,今天心血来潮想写一个自己设计的动画效果,发现学习动画代码比较简单,但…

android 动画中插值器Interpolator详解

1、插值器简介–Interpolator 通俗易懂的说,Interpolator负责控制动画变化的速率,即确定了 动画效果变化的模式,使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化 动画是开发者给定开始和结束的“关键帧”,…

Android中的属性动画

1.属性动画简介 接下来我们学习Android动画中的第三种动画——属性动画(Property Animation) Animation一般动画就是我们前面学的帧动画和补间动画!Animator则是本节要讲的属性动画! 1.1为什么要用属性动画 补间动画功能比较单调,只有四种动画(透明度…

android 动画库

1. Spruce(安卓动画库)(是一个轻量级的动画库,可以帮助排版屏幕上的动画。使用有很多不同的动画库时,开发人员需要确保每个视图都能够在适当的时间活动。) 2. Litho(是一个非常强大的框架,以声明的方式构建…

android动画类型有哪几种,Android动画概念大揭秘

前言 说起Android里面的动画,我可能会立马想起平移、旋转、渐变、缩放等动画效果,但是对于他们的属性就记的不太清了,知道的都是皮毛而且很容易忘记,每次需要用到的时候总要去baidu或者google,完全无法做到灵活应用,信手拈来。所以抽时间重新温故了一下动画相关的知识,把…

Android 动画分类

前言 动画的使用 是 Android 开发中常用的知识可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策本文将献上一份Android动画的全面介绍攻略,包括动画的种类、使用、原理等,能…

Android动画

这篇博客主要总结一下自己在项目中对动画的一些使用。我写博客,其实更多的是总结自己在工作中用到的一些知识。比如某一段时间一个知识点相关的技术用的比较多,那我会总结一下。其实,对于Android动画的总结,这是几个月前就应该写完…

Android动画之帧动画

在Android开发时,为了实现一些动态的炫酷的效果,我们常用到帧动画,View动画(补间动画)和属性动画,今天就来总结下我在使用帧动画的实现方式。 1、什么是帧动画? 帧动画就是顺序播放一组预先定…

【Android】动画

概念 动画实际上就是在指定的时间段内持续的修改某个属性的值,使得该值在指定取值范围之内平滑的过渡 android中的动画分为:View动画、帧动画和属性动画 帧动画 Frame动画是一系列图片按照一定的顺序展示的过程,它的原理是在一定的时间段内切…

STM32 LWIP SNTP实现毫秒级的时间校准

1、首先配置LWIP支持SNTP 然后在opt.h中增加一个timeout->LWIP_SNTP 防止出现类似 Assertion "sys_timeout: timeout ! NULL, pool MEMP_SYS_TIMEOUT is empty" failed at line 190 in ../Middlewares/Third_Party/LwIP/src/core/timeouts.c 这样的错误。 /*…

NTP/SNTP协议介绍和校时服务器搭建

文|Seraph 本文主要简单介绍用于校时的NTP/SNTP协议 同时,以windows 2008 R2为例,搭建NTP/SNTP服务器 NTP可参考文献RFC1305,SNTP可参考文献RFC1796 1. 应用场景 一般应用,连上公网即可通过NTP/SNTP协议进行校时,例如…

linux sntp 代码,C语言window(linux)平台的SNTP实现

C语言实现window(linux)平台的SNTP,本程序功能主要是实现电脑(或者设备)时间同步。摘录部分代码: unsigned char liVnMode; /* LeapSecond(2bits:0), VersionNumber(3bits: 3), Mode(3bits: Client3, Server4) */ unsigned char stratum; /* 时间层级 (0…

学习日记——ESP8266SNTP

SNTP基本知识 1、定义 SNTP是简单网络时间协议,而NTP网络时间协议就是网络计算机上同步计算时间的协议,具有高度的精确性,实际上也用不到这么高精度的算法。所以就在NTP上简化了以下变成SNTP,SNTP协议主要被用来同步因特网上计算…

WiFi开发|ESP8266模组SDK开发之SNTP协议

ESP8266模组SDK开发之SNTP协议 1. NTP和SNTP NTP 是网络时间协议(Network Time Protocol),是用来同步网络设备(如计算机、手机)的时间的协议 SNTP由NTP改编而来(简单网络时间协议,Simple Net…

ESP8266学习笔记(11)——SNTP接口使用

一、SNTP简介 简单网络时间协议(Simple Network Time Protocol),由 NTP 改编而来,主要用来同步因特网中的计算机时钟 二、SNTP接口 SNTP 接口位于 ESP8266_NONOS_SDK/include/sntp.h。 三、初始化SNTP 设置三个时间服务器…

ESP32 SNTP配置

SNTP,Simple Network Time Protocol(简单网络时间协议),用来同步时钟。 百度百科:SNTP SNTP协议采用客户端/服务器的工作方式,可以采用单播(点对点)或者广播(一点对多点&…

通过sntp同步系统时间

通过sntp同步系统时间 小型物联网设备,很少有接口提供给用户进行数据交互,那么我们设备的系统时间只能够通过获取网络时间后,再更新到本地。那么,就少不了使用sntp协议。 ntp协议:NTP(Network Time Protocol&#xff…