前言
属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。
1. ValueAnimator
ValueAnimator
主要负责值的计算和过度,以及动画的播放次数、播放模式和动画监听等。
ValueAnimator animator = ValueAnimator.ofFloat(1, 0.5f, 1);
animator.setDuration(3000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
imageView.setScaleX(value);
}
});
animator.start();
ofFloat(float...)
方法设置开始和结束值,addUpdateListener(AnimatorUpdateListener)
监听值的变化,用来改变图片的宽度,start()
方法开始动画。
效果如下
2. ObjectAnimator
ObjectAnimator
继承ValueAnimator
,可以直接修改对象的属性。
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "scaleX", 1, 0.5f, 1);
animator.setDuration(3000);
animator.start();
3. PropertyValuesHolder
PropertyValuesHolder
用来保存属性的值。在ObjectAnimator.ofFloat(Object, String, float...)
方法里面,调用ValueAnimator.setFloatValues(float...)
方法,使用mValues[0]
保存数据。
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);
}
mInitialized = false;
}
只需要定义多个PropertyValuesHolder
,就可以实现多动画。
PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.5f, 1.0f);
PropertyValuesHolder yHolder = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.5f, 1.0f);
ObjectAnimator.ofPropertyValuesHolder(imageView, xHolder, yHolder)
.setDuration(3000)
.start();
效果如下
4. AnimatorSet
AnimatorSet
也可以实现多个动画效果。
ObjectAnimator xAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 0.5f, 1.0f);
ObjectAnimator yAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 0.5f, 1.0f);
AnimatorSet animator = new AnimatorSet();
animator.playTogether(xAnimator, yAnimator);
animator.setDuration(3000);
animator.start();
AnimatorSet
还可以指定动画的顺序,调用playSequentially()
方法依次播放动画。
ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.5f, 1.0f);
animator1.setDuration(2000);
ObjectAnimator xAnimator2 = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 0.5f, 1.0f);
ObjectAnimator yAnimator2 = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 0.5f, 1.0f);
AnimatorSet scaleAnimator = new AnimatorSet();
scaleAnimator.playTogether(xAnimator2, yAnimator2);
scaleAnimator.setDuration(2000);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f);
animator3.setDuration(2000);
AnimatorSet animator = new AnimatorSet();
animator.playSequentially(animator1, scaleAnimator, animator3);
animator.start();
也可以调用play()
、with()
、after()
和before()
方法实现。
ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.5f, 1.0f);
animator1.setDuration(2000);
ObjectAnimator xAnimator2 = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 0.5f, 1.0f);
xAnimator2.setDuration(2000);
ObjectAnimator yAnimator2 = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 0.5f, 1.0f);
yAnimator2.setDuration(2000);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f);
animator3.setDuration(2000);
AnimatorSet animator = new AnimatorSet();
animator.play(xAnimator2).with(yAnimator2).after(animator1).before(animator3);
animator.start();
效果如下
5. Keyframes
Keyframes
是一个时间/值对,通过它可以定义一个在特定时间的特定状态。在PropertyValuesHolder
中也是采用Keyframes
保存数据的。
public void setFloatValues(float... values) {
mValueType = float.class;
mKeyframes = KeyframeSet.ofFloat(values);
}
自定义Keyframes
Keyframe keyframe1 = Keyframe.ofFloat(0f, 1.0f);
Keyframe keyframe2 = Keyframe.ofFloat(0.2f, 0.5f);
Keyframe keyframe3 = Keyframe.ofFloat(0.4f, 1.0f);
Keyframe keyframe4 = Keyframe.ofFloat(0.7f, 0f);
Keyframe keyframe5 = Keyframe.ofFloat(1.0f, 1.0f);
PropertyValuesHolder xHolder = PropertyValuesHolder.ofKeyframe("scaleX",
keyframe1, keyframe2, keyframe3, keyframe4, keyframe5);
PropertyValuesHolder yHolder = PropertyValuesHolder.ofKeyframe("scaleY",
keyframe1, keyframe2, keyframe3, keyframe4, keyframe5);
ObjectAnimator.ofPropertyValuesHolder(imageView, xHolder, yHolder)
.setDuration(3000)
.start();
效果如下
6. TypeEvaluator
TypeEvaluator
根据属性的开始、结束值和因子计算出当前的属性值。已有子类ArgbEvaluator
、IntEvaluator
和FloatEvaluator
等。如果没有指定,默认是IntEvaluator
或FloatEvaluator
。
void init() {
if (mEvaluator == null) {
// We already handle int and float automatically, but not their Object
// equivalents
mEvaluator = (mValueType == Integer.class) ? sIntEvaluator :
(mValueType == Float.class) ? sFloatEvaluator :
null;
}
if (mEvaluator != null) {
// KeyframeSet knows how to evaluate the common types - only give it a custom
// evaluator if one has been set on this class
mKeyframes.setEvaluator(mEvaluator);
}
}
自定义TypeEvaluator,实现了上面Keyframes的效果
TypeEvaluator<Float> typeEvaluator = new TypeEvaluator<Float>() {
FloatEvaluator evaluator = new FloatEvaluator();
@Override
public Float evaluate(float fraction, Float startValue, Float endValue) {
if (fraction <= 0.2f) {
return evaluator.evaluate(fraction/0.2f, 1.0f, 0.5f);
} else if (fraction <= 0.4f) {
return evaluator.evaluate((fraction - 0.2f)/0.2f, 0.5f, 1.0f);
} else if (fraction < 0.8f) {
return evaluator.evaluate((fraction - 0.4f)/0.4f, 1.0f, 0f);
} else if (fraction <= 1) {
return evaluator.evaluate((fraction - 0.8f)/0.2f, 0f, 1.0f);
}
return endValue;
}
};
PropertyValuesHolder xHolder = PropertyValuesHolder.ofObject("scaleX", typeEvaluator, 0f, 1.0f);
PropertyValuesHolder yHolder = PropertyValuesHolder.ofObject("scaleY", typeEvaluator, 0f, 1.0f);
ObjectAnimator.ofPropertyValuesHolder(imageView, xHolder, yHolder)
.setDuration(3000)
.start();
相关文章
Animation动画
帧动画
属性动画
组件动画
Transition动画