3.1 ValueAnimator 的基本使用
3.1.1 概述
1.视图动画:补间动画、逐帧动画
2.属性动画:ValueAnimator、ObjectAnimator
- 不同
类型 |
引入时间不同 |
包名 |
命名不同 |
视图动画 |
API 1 |
android.view.animation |
XXXAnimation |
属性动画 |
API 11 |
android.animator |
XXXAnimator |
- 视图动画仅能对指定的控件做动画,属性动画是通过改变某一控件的属性值来做动画。
3.1.2 ValueAnimator 的简单使用
- 针对值,不会对控件执行任何操作。
ValueAnimator animator = ValueAnimator.ofInt(0, 400);
animator.setDuration(6000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (Integer)animation.getAnimatedValue();
}
});
animator.start();
3.1.3 常用函数
1.ofInt()、ofFloat()
2.getAnimatedValue()
3.setDuration()
4.setRepeatCount() 循环次数
5.setRepeatMode()
ValueAnimation.RESTART 正序
ValueAnimation.REVERSE 倒序
6.cancel() 取消
7.addUpdateListener()
8.addListener()
9.removeUpdateListener()
10.removeAllUpdateListeners()
11.removeListener()
12.removeAllListeners()
3.2 自定义插值器与 Evaluator
- 当前动画的数值进度
input:当前动画的进度,取值 0-1
getInterpolation:实际进度
class MyInterpolator implements TimeInterpolator{
@Override
public float getInterpolation(float input) {
return 0;
}
}
3.2.2 Evaluator
- 转换器,它能把小数进度转换成对应的数值位置
- 根据数值进度计算当前值
public class MyEvaluator implements TypeEvaluator<Integer>{
@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
return null;
}
}
- ArgbEvaluator:颜色值过度
3.3 ValueAnimator 进阶-ofObject
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)
3.4 ObjectAnimator
- 继承 ValueAnimator
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values){}
- 通过指定属性所对应的 set 函数来做动画
- 注意点:
- 必须存在 set 函数
- set 函数必须采用驼峰命名
3.4.2 ObjectAnimator 动画原理
- ValueAnimator:定义动画区间 -> 插值器(返回当前动画数值进度)-> Evaluator(根据数值进度计算当前值)-> 监听器返回
- ObjectAnimator:定义动画对象及区间 -> 插值器(返回当前动画数值进度)-> Evaluator(根据数值进度计算当前值)-> 调用 set 函数(根据属性拼装 set 函数 并反射调用,变将当前值作为参数传入)
3.4.4 何时需要实现对应属性的 get 函数
- ofObject 函数而言,不一定存在初始值,要有对应的 get 函数
- 动画只有一个过渡值是,系统才会调用对应属性的 get 函数来得到动画的初始值,不存在,会去动画参数类型的默认值作为初始值。
3.5 组合动画-AnimatorSet
3.5.1 playSequentially() 和 playTogther()
- 前者表示所有动画依次播放,后者表示所有动画一起播放
- 开始动画时,只是把每个空间的动画激活,至于每个控件自身的动画是否延时、是否无限循环,之语空间自身的动画设定有关,与函数本身无关。
3.5.2 AnimatorSet.Builder
AnimatorSet.Builder builder = animator.play(tvAnimator1);
builder.with(tvAnimator2);
1.paly() 先播放那个动画
2.with() 一起播放
3.before() 先执行这个动画,再执行前面的动画
4.after() 先执行前面动画,再执行这个动画
5.after(long delay) 延迟执行
3.5.4 常用函数
1.setTarget() 设置 ObjectAnimator 动画目标控件
2.setStartDelay() 设置延时开始动画时长 不会覆盖单个动画的延时
3.5.5 示例:路径动画
3.6 Animator 动画 XML 实现
1.<animator> 对应 ValueAnimator
2.<objectAnimator> 对应 ObjectAnimator
3.<set> 对应 AnimatorSet