Цепная анимация не работает с AnimatorSet - PullRequest
1 голос
/ 16 мая 2019

Я хочу «моргнуть» 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);

Чего мне не хватает?Я просто хочу улучшить первый блок кода, так как он выглядит ужасно.

1 Ответ

2 голосов
/ 16 мая 2019

Вы не запускаете его:

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