android属性动画-Property Animations
Animation – Property Animations
属性动画出现前,View Animation 必须作用在 View 上,,且只有几种种受限的动画效果,最糟糕的是,它改变只是View的快照,View的实际属性并没有改变,实在是很不方便。
属性动画可以改变任意你想改变的东西,不再限制于view上使用,看属性动画的工作流程。
ValueAnimator
中持有动画的时间,开始值结束值,还有时间计算器和插值器。
TimeInterpolator
定义动画的时间轴。
TypeEvaluator定义属性的求值过程
。
ValueAnimator
你可以指定在给定时间内,从一个值变化到另一个值。
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
你也可以定义自己的插值器:ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();
但这仅仅只是定义了一个值的变化过程,我们并么有用到这些值。在我们定义高级动画的时候我们会用到ValueAnimator.AnimatorUpdateListener 在onAnimationUpdate()得到插值器计算的值getAnimatedValue(),然后利用计算的值,做我们想做的操作。我们可以用这个类做些高级动画。
ObjectAnimator
ObjectAnimator为ValueAnimator的子类。ObjectAnimator提供了直接操作对象属性的方法。大多数情况下我们都是使用这个类。如下,这个属性动画救赎操作view的alpha属性。
Animator fadeAnim = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
fadeAnim.start();
Evaluators
求值器:IntEvaluator 默认整形求值器,FloatEvaluator默认Float求值器,ArgbEvaluator默认ARGB求值器,TypeEvaluator这是一个留个用户的接口,你返回的值并非上述3中类型,所以你可以定义自己的求值器。这个是FloatEvaluator
的实现过程,如果要定义自己的求值器,可以参照这个。
public class FloatEvaluator implements TypeEvaluator {
public Object evaluate(float fraction, Object startValue, Object endValue) {
float startFloat = ((Number) startValue).floatValue();
return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
}
}
Specifying Keyframes
指定的动画帧,每个帧都是一个单独的求值器,然后用PropertyValuesHolder
将他们包装到一起。具体使用方法:
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)
rotationAnim.setDuration(5000ms);
第一种
ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);
ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(animX, animY);
animSetXY.start();
第二种
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
Interpolators
常用插值器:
AccelerateDecelerateInterpolator |
先加速后减速插值器 |
AccelerateInterpolator |
加速插值器 |
AnticipateInterpolator |
先向后然后猛地向前 |
AnticipateOvershootInterpolator |
像橡皮筋一样弹射 |