【问题标题】:Chain animations not working with AnimatorSet链式动画不适用于 AnimatorSet
【发布时间】:2019-05-16 13:03:56
【问题描述】:

我想将视图“闪烁”3 倍(缩小和放大,重复 3 倍)。它有效,但不适用于 AnimatorSet。

这行得通:

ibOffers.animate().scaleX(0.7f).scaleY(0.7f).setDuration(200).withEndAction(new Runnable() {
    @Override
    public void run() {
        ibOffers.animate().scaleX(1.0f).scaleY(1.0f).setDuration(200).withEndAction(new Runnable() {
            @Override
            public void run() {
                ibOffers.animate().scaleX(0.7f).scaleY(0.7f).setDuration(200).withEndAction(new Runnable() {
                    @Override
                    public void run() {
                        ibOffers.animate().scaleX(1.0f).scaleY(1.0f).setDuration(200).withEndAction(new Runnable() {
                            @Override
                            public void run() {
                                ibOffers.animate().scaleX(0.7f).scaleY(0.7f).setDuration(200).withEndAction(new Runnable() {
                                    @Override
                                    public void run() {
                                        ibOffers.animate().scaleX(1.0f).scaleY(1.0f).setDuration(200).withEndAction(new Runnable() {
                                            @Override
                                            public void run() {

                                            }
                                        });
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    }
});

但这不是:

final ObjectAnimator scaleDownAnimation =
        ObjectAnimator.ofPropertyValuesHolder(ibOffers,
                PropertyValuesHolder.ofFloat(View.SCALE_X,0.7f),
                PropertyValuesHolder.ofFloat(View.SCALE_Y,0.7f))
        .setDuration(200);

final ObjectAnimator scaleBackAnimation =
        ObjectAnimator.ofPropertyValuesHolder(ibOffers,
                PropertyValuesHolder.ofFloat(View.SCALE_X,1f),
                PropertyValuesHolder.ofFloat(View.SCALE_Y,1f))
                .setDuration(200);

AnimatorSet s = new AnimatorSet();
s.playSequentially(scaleDownAnimation,
        scaleBackAnimation,
        scaleDownAnimation,
        scaleBackAnimation,
        scaleDownAnimation,
        scaleBackAnimation);

我错过了什么?我只是想改进第一个代码块,因为它看起来很丑。

【问题讨论】:

    标签: java android animatorset


    【解决方案1】:

    你没有开始它:

    s.start();
    

    另外,您不能重复使用ObjectAnimator。因此,您必须为动画的每个步骤创建三个副本。您可以使用一个小的实用方法来避免重复太多代码。

    您的完整序列将是:

    ObjectAnimator getScaleAnimation(View v, float scale, int duration) {
        return ObjectAnimator.ofPropertyValuesHolder(v,
            PropertyValuesHolder.ofFloat(View.SCALE_X, scale),
            PropertyValuesHolder.ofFloat(View.SCALE_Y, scale))
            .setDuration(duration);
    }
    
    AnimatorSet s = new AnimatorSet();
    s.playSequentially(
        getScaleAnimation(ibOffers, 0.7f, 250),
        getScaleAnimation(ibOffers, 1.2f, 250),
        getScaleAnimation(ibOffers, 0.7f, 250),
        getScaleAnimation(ibOffers, 1.2f, 250),
        getScaleAnimation(ibOffers, 0.7f, 250),
        getScaleAnimation(ibOffers, 1.0f, 250));
    
    s.start();
    

    【讨论】:

    • 你能试着做一个“眨眼”吗?
    • 查看我的更新答案。问题是你不能重复使用ObjectAnimator,所以你必须为每个创建3个副本(这是我的怀疑和我之前评论的原因)。
    猜你喜欢
    • 2015-02-11
    • 2015-02-18
    • 2015-07-06
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2016-02-22
    相关资源
    最近更新 更多