谨以文章记录学习历程,如有错误还请指明。
动画综述
Google大大对动画的总述如下:
Animations can add visual cues that notify users about what’s going on in your app. They are especially useful when the UI changes state, such as when new content loads or new actions become available. Animations also add a polished look to your app, which gives it a higher quality look and feel.
没错,放上原文我只是装个逼,~
简单来说,动画就两个作用:
- 添加可视提示,通知我们这个APP中正在发生的事情。比如用户界面发生变化时,有新的内容加载或某些操作变为可用。
- 提供高逼格的外观(装逼利器)
动画的分类如下:
属性动画(Property Animation)
概述
- 视图动画的缺陷:
- 对象的局限性:仅限于View
- 只改变了View的视觉效果,而没有改变View的属性
- 动画效果单一
- 属性动画的特点:
- 作用对象:任意对象,甚至没对象也可以
- 作用方式:改变对象的属性
- 动画效果:按需自定义,不再局限于上述4种基本变换
- 继承关系
Java类名 | XML关键字 | 说明 |
---|---|---|
ValueAnimator | <animator> 放置在res/animator/目录下 |
在一个特定的时间里执行一个动画 |
TimeAnimator | 无 | 时序监听回调工具 |
ObjectAnimator | <objectAnimator> 放置在res/animator/目录下 |
一个对象的一个属性动画 |
AnimatorSet | <set> 放置在res/animator/目录下 |
动画集合 |
工作原理
指定时间内,修改属性(对象中对应的字段)的值,以此实现该对象在属性上的动画效果。
为了更好的理解,我们举一个栗子:
图1中我们搞出了一个假象的对象,动画作用于这个对象(实际可以说是对象的x属性,也即对象的水平位置),动画持续40ms,移动距离40px。每10ms(默认刷新速率),对象水平移动10px。40ms后,动画结束,物体停止在x=40处。这是一个典型的设置了linearInterpolator(匀速插值器)的动画。
为了更好的了解属性动画的工作原理,下面我们来看一看属性动画的组件是怎么计算上面例子的动画的。
其逻辑可以总结如下:
1.为 ValueAnimator 设置动画的时长,以及对应属性的始 & 末值
2.设置属性在 始 & 末值 间的变化逻辑
- TimeInterpolator实现类:插值器-描述动画的变化速率
- TypeEvaluator实现类:估值器-描述 属性值 变化的具体数值
3.根据2中的逻辑更新当前值
4.获取3中更新的 值 ,修改 目标属性值
5.刷新视图。
6.重复4-5,直到 属性值 == 末值
下面给出动画工作的关键类
Java类 | 说明 |
---|---|
ValueAnimator | 动画执行类;核心 |
ObjectAnimator | 动画执行类 |
TimeInterpolator | 时间插值(插值器接口),控制动画变化率 |
TypeEvaluator | 类型估值(估值器接口),设置属性值计算方式,根据属性的 始 & 末值 和 插值 一起计算出当前时间的属性值 |
AnimatorSet | 动画集 |
AnimatorInflater | 加载属性动画的XML文件 |
一些额外的类
Java类 | 说明 |
---|---|
LayoutTransition | 布局动画,为布局的容器设置动画 |
ViewPropertyAnimator | 为View的动画操作提供一种更加便捷的用法 |
PropertyValuesHolder | 保存动画过程中所需要操作的属性和对应的值 |
Keyframe | 控制每个时间段执行的动画距离 |
AnimationListener AnimationUpdateListener AnimatorListenerAdapter |
动画事件的监听 |
具体使用
ValueAnimator
- 属性动画的最核心的类
- 原理:控制 值 的变化,之后 手动 赋值给对象的属性,从而实现动画
对于控制的 值 的不同,Android 提供给我们三种构造方法来实例ValueAnimator对象
1. ValueAnimator.ofInt(int… values) – 整型数值
2. ValueAnimator.ofFloat(float… values) – 浮点型数值
3. ValueAnimator.ofObject(TypeEvaluator evaluator, Object… values) – 自定义对象类型
下面我们一一介绍
ValueAnimator.ofInt()
- 作用:将初始值 以整型数值的形式 过渡到结束值
- 估值器:内置
IntEvaluator
估值器 - 具体使用:
操作 值 的方式分为 XML 方式/ Java 代码方式
方式1: Java 方式
推荐 Java 方式,因为某些时候我们需要动态获取属性的起始值,显然XML方式是不支持动态获取的。
//设置动画 始 & 末值
//ofInt()两个作用:
//1. 获取实例
//2. 在传入参数之间平滑过渡
//如下则0平滑过渡到3
ValueAnimator animator = ValueAnimator.ofInt(0,3);
//如下传入多个参数,效果则为0->5,5->3,3->10
//ValueAnimator animator = ValueAnimator.ofInt(0,5,3,10);
//设置动画的基础属性
animator.setDuration(5000);//播放时长
animator.setStartDelay(300);//延迟播放
animator.setRepeatCount(0);//重放次数
animator.setRepeatMode(ValueAnimator.RESTART);
//重放模式
//ValueAnimator.START:正序
//ValueAnimator.REVERSE:倒序
//设置更新监听
//值 改变一次,该方法就执行一次
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//获取改变后的值
int currentValue = (int) animation.getAnimatedValue();
//输出改变后的值
Log.d("1111", "onAnimationUpdate: " + currentValue);
//改变后的值发赋值给对象的属性值
view.setproperty(currentValue);
//刷新视图
view.requestLayout();
}
});
//启动动画
animator.start();
以上就是一个标准的Java方式的模板
方式2: XML 方式
1.在路径 res/animator/
路径下常见 XML 文件,如 set_animator.xml
2.在上述文件中设置动画参数
// ValueAnimator采用<animator> 标签
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType"
android:repeatCount="1"
android:repeatMode="reverse"/>
/>
3.Java代码启动动画
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation);
// 载入XML动画
animator.setTarget(view);
// 设置动画对象
animator.start();
// 启动动画
ValueAnimator.ofFloat()
- 作用:将初始值 以浮点型数值的形式 过渡到结束值
- 估值器:内置
FloatEvaluator
估值器 - 具体使用:
和ValueAnimator.ofInt()及其类似,以下只说明不同之处,省略部分参考ofInt()
方式1:Java方式
ValueAnimator anim = ValueAnimator.ofFloat(0, 3);
//只是改了实例方法,除此之外完全一样
方式2:XML方式
只在设置动画 XML 文件中的属性时略有不同
// ValueAnimator 采用 <animator> 标签
// ObjectAnimator 采用 <objectAnimator> 标签
<anima