#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, а не анимация, так что это не вариант