Как reset AnimationDrawable
Мне нужно анимировать круговой таймер обратного отсчета, и я делаю это, анимируя фон ImageView с помощью AnimationDrawable (каждое изображение имеет соответствующий срез удаленной окружности). Проблема в том, что пользователь имеет возможность приостанавливать эту анимацию, поэтому мне приходится перезагружать анимацию, но потом появляется проблема. Я попытался настроить анимацию на нуль, установив фон ImageView равным null, установив видимость анимации, но практически ничего не помогло, потому что количество кадров остается неизменным. Я должен найти обходное решение для удаления всех фреймов и добавления новых или к reset всей анимации в состояние по умолчанию.
Шаг 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
У меня была та же проблема, когда остановка анимации остановилась бы на текущем кадре. Я хотел, чтобы он вел себя как iOS, где остановка вернется к первому кадру. Это решение работает для меня:
((AnimationDrawable)(someButton.getBackground())).stop();
someButton.setBackgroundDrawable(null);
someButton.setBackgroundResource(R.drawable.animation);
Это сначала останавливает (возможно, не обязательно). Затем он убивает фоновую анимацию. Наконец, он воссоздает фон.
Ответ 2
Это отправит (AnimationDrawable) timerAnimation
в первый кадр, как только будет вызван stop()
:
timerAnimation.stop();
timerAnimation.selectDrawable(0);
Ответ 3
Другим возможным решением могло бы быть одно и то же изображение для первого кадра и последнего кадра и сделать следующее вместо вызова метода stop().
((AnimationDrawable)(someButton.getBackground())).setOneShot(true);
если кто-нибудь еще это рассмотрит. Существует также метод, называемый setVisible (булевский видимый, булевский перезапуск). Однако это не сработало для меня.
Ответ 4
Вы можете попробовать public boolean setVisible (boolean visible, boolean restart)
, и он будет воспроизводить анимацию один раз. Например:
animationDrawable.setVisible(false, true);
Ответ 5
android.view.animation.Animation.reset() не работает?