Цепная анимация не работает с AnimatorSet

Я хочу "моргнуть" 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 ответ

Решение

Вы не начинаете это:

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();
Другие вопросы по тегам