Подтвердить что ты не робот

Как 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 в качестве текущего количества кадров. (начальный индекс здесь установлен на последний скрытый кадр, когда нажата кнопка паузы.)

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

Спасибо

4b9b3361

Ответ 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() не работает?