文章目录
属性动画
Android中的动画分为三种:
- View Animation 视图动画
- Tween Animation 补间动画
- Property Animator 属性动画
属性动画也有两种:
- ValueAnimator 单一的属性动画(包括ObjectAnimator、TimeAnimator)
- AnimatorSet 多个属性动画组合
属性动画的使用
属性动画可以用xml或者代码来表达,这里会选择代码的形式,比较容易理解。
属性动画的使用也不难,例如我们做一个位移属性的动画
// 设置位移动画
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", 0, 1000);
//设置持续时间
animator.setDuration(1500);
//设置线性时间插值器
animator.setInterpolator(new LinearInterpolator());
// 开始
animator.start();
动画监听
动画支持添加多个监听器
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
// 动画开始
}
@Override
public void onAnimationEnd(Animator animator) {
// 动画结束
}
@Override
public void onAnimationCancel(Animator animator) {
// 动画取消
}
@Override
public void onAnimationRepeat(Animator animator) {
// 动画重复
}
});
插值器(Interpolator)
-
定义:
利用时间流逝来换算当前的进度的百分比
-
种类:
- LinearInterpolator(线性插值器):匀速动画
- AccelerateDecelerateInterpolator(加速减速插值器):动画开始和结束慢,中间快。
- DecelerateInterpolator(减速插值器):动画逐渐变慢
-
使用:
animator.setInterpolator(new LinearInterpolator());
估值器(TypeEvaluator)
-
定义:
利用进度的百分比来换算当前属性值是多少
-
种类:
- IntEvaluator:针对整型属性
- FloatEvaluator:针对浮点型属性
- ArgbEvaluator:针对Color属性
-
作用
结合插值器获取当前的进度比,加上估值器计算出属性值,设置给作用的对象,这样表现出随着时间流逝,对象的属性值会发生不断的变化。这就是属性动画的基本原理。
同样也可以自定义Interpolator和TypeEvaluator来自定义自己想要的动画效果。
-
使用
1.设置TypeEvaluator
animator.setEvaluator(TypeEvaluator value)
2.构造函数
ObjectAnimator animator = Animator.ofObject(TypeEvaluator实例, 起始值, 结束值)
默认设置为FloatEvaluator
ObjectAnimator animator = ofFloat(Object target, String propertyName, float... values)
属性动画的两个条件
-
对象的类要提供set方法来修改属性值,因为属性动画就是利用反射修改对应的属性,如果对象的属性值没有初始化值,还需要提供get方法来获取属性值
-
修改对象属性值的set方法,UI界面应该有所变化,否则也会看不出动画效果
属性动画原理解析
ObjectAnimator初始化
从ObjectAnimator的ofFloat开始,我们看下ObjectAnimator的初始化
// ObjectAnimator.java
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
ObjectAnimator anim = new ObjectAnimator(target, propertyName);
anim.setFloatValues(values);
return anim;
}
在ObjectAnimator中,有几个重要的变量
mTarget 表示作用的对象
mPropertyName 表示动画的属性名
mProperty 就是存储着属性类型和名字,跟反射有关
// ObjectAnimator
private WeakReference<Object> mTarget;
private String mPropertyName;
private Property mProperty;
private boolean mAutoCancel = false;
private ObjectAnimator(Object target, String propertyName) {
setTarget(target);
setPropertyName(propertyName);
}
这里都是设置动画的初始值
// ObjectAnimator.java
public void setFloatValues(float... values) {
if (mValues == null || mValues.length == 0) {
// No values yet - this animator is being constructed piecemeal. Init the values with
// whatever the current propertyName is
if (mProperty != null) {
setValues(PropertyValuesHolder.ofFloat(mProperty, values));
} else {
setValues(PropertyValuesHolder.ofFloat(mPropertyName, values));
}
} else {
super.setFloatValues(values);
}
}
// ValueAnimator.java
public void setFloatValues(float... values) {
if (values == null || values.length == 0) {
return;
}
if (mValues == null || mValues.length == 0) {
setValues(PropertyValuesHolder.ofFloat("", values));
} else {
PropertyValuesHolder valuesHolder = mValues[0];
valuesHolder.setFloatValues(values);
}
// New property/values/target should cause re-initialization prior to starting
mInitialized = false;
}
ObjectAnimator start()启动
属性动画启动
//ObjectAnimator
public