【Android】Android三种属性动画的使用

Android 3.0提供了属性动画,几乎可以代替补间动画。属性动画用法更加简洁,功能更多强大。使用属性动画的两个类是ValueAnimator和ObjectAnimator。

ValueAnaimator使用示例
  ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);//设置变化范围0到100
        valueAnimator.setDuration(3000);//设置播放时间毫秒
        valueAnimator.setStartDelay(1000);//设置延时时间毫秒
        valueAnimator.setRepeatCount(0);//设置重复次数
        valueAnimator.setRepeatMode(ValueAnimator.RESTART);//设置重复模式
        valueAnimator.start();//开始播放
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int value = (int) animation.getAnimatedValue();
                //获取实时数值并更新到需要的View上
            }
        });

ObjectAnimator比ValueAnimator更高级,不用监听数据变化,它可以直接修改指定的属性。前提是对象必须有对应的setXXX()方法和getXXX()方法。如果没有这两个方法,我们可以通过继承或者组合来添加这两个方法。

ObjectAnimator使用示例
 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f);
        objectAnimator.setDuration(300);
        ... //设置若干属性省略
        objectAnimator.start();

以上是单一动画,如果要使用组合动画,可以使用PropertyValuesHolder。
ValueAnimator和ObjectAnimator组合动画的用法一样,下面是ObjectAnimator的组合动画使用示例

组合动画使用示例
    PropertyValuesHolder translateHolder = PropertyValuesHolder.ofFloat("translationY", 0, 500);
    PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofFloat("alpha", 0f, 1f, 0f);
        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(view, alphaHolder, translateHolder);
        objectAnimator.setDuration(3600);
        objectAnimator.setStartDelay(1000);
        objectAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
          //监听动画结束
            }
        });
        objectAnimator.start();

如果要修改的属性不是数值类型的,我们可以使用对应的ofObject方法:
ValueAnimator.ofObject方法源码:

   public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setObjectValues(values);
        anim.setEvaluator(evaluator);
        return anim;
    }

ObjectAnimator.ofObject方法源码:

   public static ObjectAnimator ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values) {
        ObjectAnimator anim = new ObjectAnimator(target, propertyName);
        anim.setObjectValues(values);
        anim.setEvaluator(evaluator);
        return anim;
    }

ofObject(…)方法需要传入一个估值器TypeEvaluator。

关于估值器

下面是自带的IntEvaluator源代码。我们只需要重写evaluate这个方法即可。
其中fraction是百分比,是系统自动计算出来的,而动画进度值是需要我们自己去算的。计算规则根据情况而定。

/**
 * This evaluator can be used to perform type interpolation between <code>int</code> values.
 */
public class IntEvaluator implements TypeEvaluator<Integer> {

    /**
     * This function returns the result of linearly interpolating the start and end values, with
     * <code>fraction</code> representing the proportion between the start and end values. The
     * calculation is a simple parametric calculation: <code>result = x0 + t * (v1 - v0)</code>,
     * where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>,
     * and <code>t</code> is <code>fraction</code>.
     *
     * @param fraction   The fraction from the starting to the ending values
     * @param startValue The start value; should be of type <code>int</code> or
     *                   <code>Integer</code>
     * @param endValue   The end value; should be of type <code>int</code> or <code>Integer</code>
     * @return A linear interpolation between the start and end values, given the
     *         <code>fraction</code> parameter.
     */
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue;
        return (int)(startInt + fraction * (endValue - startInt));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值