概述
简介
ValueAnimator 是动画机制中最核心的一个类。
原理
- 通过不断控制 值 的变化,再不断 手动 赋给对象的属性,从而实现动画效果。
- 具体如图下:
整型:ValueAnimator.ofInt()
作用
将初始值 以整数形式 过渡到结束值 (即估值器是整型估值器 - IntEvaluator
)
原理
具体使用
因为ValueAnimator
本质只是一种值的操作机制,因此先学习一下改变一个值的过程。
操作值的方式 分为 XML
设置 / Java
代码设置
1.Java代码设置
实际开发中,建议使用Java代码实现属性动画:因为很多时候属性的起始值是无法提前确定的(无法使用XML设置),这就需要在
Java
代码里动态获取。
下面的代码主要看看注释就行了,后面再实战。
1 | // 步骤1:设置动画属性的初始值 & 结束值 |
效果
值 从初始值 过度到 结束值 的过程如下:
2.在XML代码中设置
具备重用性,即将通用的动画写到XML里,可在各个界面中去重用它
步骤1:在路径
res/animator
的文件夹里创建相应的动画.xml
文件此处设置为
res/animator/set_animation.xml
步骤2:设置动画参数
set_animation.xml
1 | // ValueAnimator采用<animator> 标签 |
- 步骤3:在Java代码中启用动画
1 | Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation); |
实例
实现的动画效果:按钮的宽度从
250px
放大到500px
1 | public class Demo_ofInt extends AppCompatActivity { |
效果:
浮点型:ValueAnimator.ofFloat()
原理
具体使用
操作值的方式 分为 XML
设置 / Java
代码设置
1.java代码中设置
1 | ValueAnimator anim = ValueAnimator.ofFloat(0, 3); |
2.在xml代码中设置
1 | // ValueAnimator采用<animator> 标签 |
在Java代码中启动动画,也是和上面一样。直接看效果:
说明
从上面可以看出,ValueAnimator.ofInt()
与ValueAnimator.oFloat()
仅仅只是在估值器上的区别:(即如何从初始值 过渡 到结束值)
ValueAnimator.oFloat()
采用默认的浮点型估值器 (FloatEvaluator
)ValueAnimator.ofInt()
采用默认的整型估值器(IntEvaluator
)
在使用上完全没有区别,此处对ValueAnimator.oFloat()
的使用就不废话了。
对象:ValueAnimator.ofObject()
作用
将初始值 以对象的形式 过渡到结束值。
工作原理
具体使用
1 | // 创建初始动画时的对象 & 结束动画时的对象 |
大概了解一下估值器
- 作用:设置动画 如何从初始值 过渡到 结束值 的逻辑
- 插值器(
Interpolator
)决定 值 的变化模式(匀速、加速blabla)- 估值器(
TypeEvaluator
)决定 值 的具体变化数值
从上面可知:
ValueAnimator.ofFloat()
实现了 将初始值 以浮点型的形式 过渡到结束值 的逻辑,那么这个过渡逻辑具体是怎么样的呢?- 其实是系统内置了一个
FloatEvaluator
估值器,内部实现了初始值与结束值 以浮点型的过渡逻辑 - 来看一下
FloatEvaluator
的代码实现:
1 | public class FloatEvaluator implements TypeEvaluator<Number> { |
ValueAnimator.ofInt()
&ValueAnimator.ofFloat()
都具备系统内置的估值器,即FloatEvaluator
&IntEvaluator
,即系统已经默认实现了 如何从初始值 过渡到 结束值 的逻辑但对于
ValueAnimator.ofObject()
,从上面的工作原理可以看出并没有系统默认实现,因为对象的动画操作复杂 & 多样,系统无法知道如何从初始对象过度到结束对象- 因此,对于
ValueAnimator.ofObject()
,我们需自定义估值器(TypeEvaluator
)来告知系统如何进行从 初始对象 过渡到 结束对象的逻辑 - 自定义实现的逻辑如下
1 | // 实现TypeEvaluator接口 |
实例
实现的动画效果:一个圆从一个点 移动到 另外一个点。
1.定义一个Point类
1 | public class Point { |
2.根据需求实现TypeEvaluator接口
- 实现
TypeEvaluator
接口的目的是自定义如何 从初始点坐标 过渡 到结束点坐标; - 本例实现的是一个从左上角到右下角的坐标过渡逻辑。
1 | //实现 TypeEvaluator 接口 |
3.将属性动画作用到自定义View当中
1 | public class MyView extends View { |
4.布局中引入MyView
activity_demo_of_object.xml
1 |
|
5.在页面中加载
1 | public class Demo_ofObject extends AppCompatActivity { |
6.效果
说明
从上面可以看出,其实ValueAnimator.ofObject()
的本质还是操作 值,只是是采用将 多个值 封装到一个对象里的方式 同时对多个值一起操作而已。
就像上面的例子,本质还是操作坐标中的x,y两个值,只是将其封装到Point对象里,方便同时操作x,y两个值而已
Demo 地址
https://github.com/Commandercc/DemoEX/blob/master/AnimationDmeo3.zip