Как сбросить AnimationDrawable - PullRequest
32 голосов
/ 07 октября 2011

Мне нужно анимировать таймер кругового обратного отсчета, и я делаю это, анимируя фон ImageView с помощью 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 как текущее количество кадров. (начальный индекс здесь устанавливается на последний скрытый кадр при нажатии кнопки паузы.)

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

Спасибо

Ответы [ 5 ]

85 голосов
/ 07 февраля 2013

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

timerAnimation.stop();
timerAnimation.selectDrawable(0);
13 голосов
/ 19 ноября 2011

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

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

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

2 голосов
/ 07 октября 2012

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

animationDrawable.setVisible(false, true);
2 голосов
/ 23 мая 2012

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

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

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

0 голосов
/ 07 октября 2011

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

...