Android ObjectAnimation запускался только один раз

Я использую API ObjectAnimator (android.animation.ObjectAnimator) для анимации кнопки после ее нажатия (v — это кнопка):

ObjectAnimator animator = ObjectAnimator.ofFloat(v, "rotationY", 360f);
animator.setDuration(5000);
animator.start();

Когда я тестирую это на эмуляторе, он работает с первого щелчка (кнопка вращается). Но когда я снова нажимаю кнопку (фрагмент не уничтожается и т. д. после первого нажатия), я не вижу никакой анимации на эмуляторе (эмулятор не самый быстрый, но с 5 секундами я должен что-то увидеть).

Нужно ли что-то уничтожать/закрывать после первой анимации или что я упускаю? У кого-нибудь есть подсказка или может воспроизвести это?

Заранее спасибо, Мартин


person hoffimar    schedule 15.03.2011    source источник
comment
Этот код находится внутри вашего события Button?   -  person Marcos Vasconcelos    schedule 15.03.2011
comment
@Marcos Vasconcelos да, это внутри метода onClick назначенного OnClickListener. Я вижу в отладчике, что код действительно выполняется. Не уверен, что делает фреймворк, поскольку он говорит, что анимация не запускается немедленно (но, я думаю, в другом потоке).   -  person hoffimar    schedule 15.03.2011


Ответы (2)


Во второй раз вы попытаетесь анимировать с 360.0f на 360.0f. Измените свой вызов ofFloat() на:

ObjectAnimator.ofFloat(v, "rotationY", 0.0f, 360.0f)
person Romain Guy    schedule 15.03.2011

Чтобы уточнить ответ Ромена, результатом конструктора фабрики с одним значением является анимация, которая будет выполняться от любого текущего значения до значения, указанного в параметрах. В вашем случае объект имел значение 0, чтобы начать с анимации (в первый раз) до значения 360. Во второй раз он анимировался от текущего значения (360) до указанного значения (360). Анимация не очень.

Исправление такое же, как указано выше: жестко закодируйте начальное и конечное значения для аниматора. Кроме того, вы можете сбросить значение до 0, когда анимация завершится, реализовав метод AnimatorListener.onAnimationEnd и сбросив его после завершения анимации:

    animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            v.setRotationY(0);
        }
    });
person Chet Haase    schedule 04.04.2011