Как сбросить AnimationDrawable

#android #animation #frame #drawable

#Android #Анимация #кадр #можно рисовать

Вопрос:

Мне нужно анимировать таймер кругового обратного отсчета, и я делаю это, анимируя фон изображения с помощью AnimationDrawable (у каждого изображения удален соответствующий фрагмент круга). Проблема в том, что у пользователя есть возможность приостановить эту анимацию, поэтому мне нужно перезагрузить анимацию, но затем появляется проблема. Я попытался установить для анимации значение null, установить для фона ImageView значение null, установить видимость анимации, но практически ничего не помогло, потому что количество кадров осталось прежним. Я должен найти обходной путь для удаления всех кадров и добавления новых или для сброса всей анимации в состояние по умолчанию.

Шаг 1 — инициализация анимации (начальный индекс кадра равен 0)

 timerView.setBackgroundResource(R.drawable.timer_switch);
timerAnimation = (AnimationDrawable)timerView.getBackground();

System.out.println("Number of frames: "   timerAnimation.getNumberOfFrames());

for (int frameIndex = startingFrameIndex; frameIndex < 60; frameIndex  ) {
    if (frameIndex < 10) {
        uri = "drawable/timer_0000"   frameIndex;
    } else {
        uri = "drawable/timer_000"   frameIndex;
    }

    imageResourceId = getResources().getIdentifier(uri, null, getPackageName());
    timerAnimation.addFrame(getResources().getDrawable(imageResourceId), timerImageFrameDuration);
}
  

Шаг 2 — вот сложная часть, где я не знаю, что делать. Вещи, которые я пробовал:

 timerAnimation.stop();
timerAnimation.setCallback(null);
timerAnimation.setVisibility(true, false);
timerAnimation = null;
  

Шаг 3 — после вызова шага 2 я снова вызываю шаг 1, но Sys.out по-прежнему отображает 60 в качестве текущего количества кадров. (начальный индекс здесь устанавливается на последний скрытый кадр при нажатии кнопки паузы.)

Любая идея приветствуется.

Спасибо

Комментарии:

1. Может ли ViewCompat.jumpDrawablesToCurrentState помочь: developer.android.com/reference/android/support/v4/view /… ?

Ответ №1:

Это отправит (AnimationDrawable) timerAnimation в первый кадр, как только stop() он будет вызван:

 timerAnimation.stop();
timerAnimation.selectDrawable(0);
  

Комментарии:

1. ИМО, это решение намного лучше и дешевле, чем принятый ответ.

Ответ №2:

У меня была та же проблема, когда остановка анимации останавливалась на текущем кадре. Я хотел, чтобы он вел себя как iOS, где остановка возвращалась бы к первому кадру. Это решение работает для меня:

 ((AnimationDrawable)(someButton.getBackground())).stop();
someButton.setBackgroundDrawable(null);
someButton.setBackgroundResource(R.drawable.animation);
  

Сначала это останавливает его (вероятно, в этом нет необходимости). Затем он убивает фоновую анимацию. Наконец, он воссоздает фон.

Ответ №3:

Другим возможным решением было бы иметь одно и то же изображение для первого и последнего кадра и выполнить следующее вместо вызова метода stop() .

 ((AnimationDrawable)(someButton.getBackground())).setOneShot(true);
  

если кто-нибудь изучит это дальше. Существует также метод, называемый setVisible (логический видимый, логический перезапуск). Однако у меня это не сработало.

Ответ №4:

Вы можете попробовать public boolean setVisible (boolean visible, boolean restart) , и он воспроизведет анимацию один раз. Например:

 animationDrawable.setVisible(false, true);
  

Ответ №5:

Я бы setVisibility(true, true) :

 timerAnimation.stop();
timerAnimation.setVisibility(true, true);
  
  • visible логическое значение: true, если видно, false в противном случае
  • restart логическое значение: когда отображается, true, чтобы принудительно перезапустить анимацию с первого кадра

Ответ №6:

android.view.animation.Animation.reset() не работает?

Комментарии:

1. это AnimationDrawable, а не анимация, так что это не вариант