属性动画2 Property Animation
ValueAnimator(差值动画)
单纯从字面上理解的话ObjectAnimator作用于某个实际的对象,而ValueAnimator是ObjectAnimator的父类,它继承自抽象类Animator,它作用于一个值,将其由一个值变化为另外一个值,然后根据值的变化,按照一定的规则,动态修改View的属性,比如View的位置、透明度、旋转角度、大小等,即可完成了动画的效果。
/*
这里通过ofFloat()方法构造一个ValueAnimator实例,除此之外还提供了
其他函数ofInt()、ofObject()、ofPropertyValuesHolder()函数,
api 21之后又提供了ofArgb(),每个函数都是可以传入多个改变值。
*/
public void initAnim() {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 126512.36f);
valueAnimator.setDuration(2000);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float money = (float) animation.getAnimatedValue();
mTextView.setText(String.format("%.2f", money));
}
});
valueAnimator.start();
}
Interpolator
//如何自定义一个插值器?举例:我们实现一个先减速后加速插值器,代码如下
public class DecelerateAccelerateInterpolator implements Interpolator {
@Override
public float getInterpolation(float input) {
float result;
if (input <= 0.5f) {
result = (float) (Math.sin(Math.PI * input)) / 2.0f;
} else {
result = (float) (2 - Math.sin(Math.PI * input)) / 2.0f;
}
return result;
}
}
TypeEvaluator
//TypeEvaluator(估值器)
/*
TypeEvaluator用于根据当前属性改变的百分比来计算改变后的属性值,系统提供了如下几种估值器
IntEvaluator 针对整型属性
IntArrayEvaluator 针对整型属性集合
FloatEvaluator 针对浮点型属性
FloatArrayEvaluator 针对浮点型属性集合
ArgbEvaluator 针对Color属性
RectEvaluator 针对Rect属性
PointFEvaluator 针对PointF属性
*/
// 接口提供了evaluate(float fraction, T startValue, T endValue);
// 动画在运行过程中Interpolator自动计算出动画运行的百分比fraction,
// 然后TypeEvaluator根据fraction计算出当前动画的属性值。
public class FloatEvaluator implements TypeEvaluator<Number> {
public Float evaluate(float fraction, Number startValue, Number endValue) {
float startFloat = startValue.floatValue();
return startFloat + fraction * (endValue.floatValue() - startFloat);
}
}
自定义TypeEvaLuator
//如何自定义TypeEvaLuator?比如我们要实现一个钱的增加,字体颜色越红的动画,
// 我们现在都知道可以使用ofArgb(),但是ofArgb()需要api 21以上才能使用,
// 所以需要我们自定义一个ArgbEvaLuator,这里为了演示自定义
// TypeEvaluator直接把api 21中提供的ArgbEvaluator源代码拿来使用
public class TextArgbEvaluator implements TypeEvaluator {
public Object evaluate(float fraction, Object startValue, Object endValue) {
int startInt = (Integer) startValue;
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff;
int endInt = (Integer) endValue;
int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff;
return (int) ((startA + (int) (fraction * (endA - startA))) << 24) |
(int) ((startR + (int) (fraction * (endR - startR))) << 16) |
(int) ((startG + (int) (fraction * (endG - startG))) << 8) |
(int) ((startB + (int) (fraction * (endB - startB))));
}
}
调用方式
//调用方式:
public void ss() {
AnimatorSet animatorSet = new AnimatorSet();
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 126512.36f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float money = (float) animation.getAnimatedValue();
Log.e("Interpolator", "money---->" + money);
mTextView.setText(String.format("%.2f", money));
}
});
int startColor = Color.parseColor("#FCA3AB");
int endColor = Color.parseColor("#FB0435");
ValueAnimator colorAnimator = ValueAnimator.ofObject(new TextArgbEvaluator(), startColor, endColor);
colorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int color = (int) animation.getAnimatedValue();
Log.e("Interpolator", "color---->" + color);
mTextView.setTextColor(color);
}
});
animatorSet.playTogether(valueAnimator, colorAnimator);
animatorSet.setDuration(5000);
animatorSet.setInterpolator(new LinearInterpolator());
animatorSet.start();
}