Android 属性动画

前言

属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。

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根据属性的开始、结束值和因子计算出当前的属性值。已有子类ArgbEvaluatorIntEvaluatorFloatEvaluator等。如果没有指定,默认是IntEvaluatorFloatEvaluator

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动画

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值