Intereting Posts

Повторить AnimatorSet

Есть простой способ повторить Android AnimatorSet (бесконечный). Могу ли я установить AnimationListener и перезапустить AnimatorSet, снова вызвав start ()?

Мой AnimatorSet содержит две анимации, которые воспроизводятся последовательно. Итак, если я установил режим повторения одной одиночной анимации, чтобы повторить, чем первая будет повторяться во время второй, не так ли?

Solutions Collecting From Web of "Повторить AnimatorSet"

Установить режим повторения и подсчета аниматоров дочерних объектов;

objectAnimator.setRepeatCount(ObjectAnimator.INFINITE); objectAnimator.setRepeatMode(ObjectAnimator.RESTART/REVERSE...); 

Однако это не может быть остановлено или отменено из-за еще одной ошибки.

Очевидно, я не являюсь поклонником множества способов, которыми вы можете анимировать вещи в Android, и заставить их всех терпеть неудачу в том или ином виде. Надеюсь, это поможет кому-то другому.

Ответ на первые два вопроса

Есть ли простой способ повторить Android AnimatorSet (бесконечный)? Могу ли я установить AnimationListener и перезапустить AnimatorSet, снова вызвав start ()?

Да, есть:

 mAnimationSet.addListener(new AnimatorListenerAdapter() { private boolean mCanceled; @Override public void onAnimationStart(Animator animation) { mCanceled = false; } @Override public void onAnimationCancel(Animator animation) { mCanceled = true; } @Override public void onAnimationEnd(Animator animation) { if (!mCanceled) { animation.start(); } } }); mAnimationSet.start(); 

Ответ на третий вопрос – нет. Первая анимация будет повторяться, и после всех повторений будет запущена следующая анимация.

Из моей головы – анимационная среда – источник боли, особенно если вы хотите поддержать 2.x. У меня обычно были проблемы с наборами, которые пытались сделать любой более сложный вид с AnimationListener с помощью AnimationListener – «игрока». Я отслеживаю, на какой анимации я играю (например, int т. Д.), А затем onAnimationEnd запускаю другую, которая должна быть в последовательности. Таким образом, я могу легко «списать» мою последовательность и не беспокоить сломанную структуру.

Таким образом, ни один из вышеперечисленных вариантов не подходит.

Если вы используете:

  @Override public void onAnimationEnd(Animator animation) { if (!mCanceled) { animation.start(); } } 

Вы иногда получаете исключение stackOverFlow.

Лучше всего сделать что-то вроде:

 Thread t = new Thread(new Runnable() { @Override public void run() { while (true && getActivity() != null) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { set3.start(); } }); SystemClock.sleep(1200); } } }); t.start(); 

Как насчет этого?

 @Override public void onAnimationEnd(Animator animation) { if (!mCanceled) { animation.reset(); //<- added. animation.start(); } }