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);

如何一次操作多个属性,下面有两种方式,一种是多个Animator,另一种是使用PropertyValuesHolder 。

第一种
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 像橡皮筋一样弹射
   

posted @ 2013-11-05 16:38  清澈见底  阅读(143)  评论(0编辑  收藏  举报