AnimationDrawable отображает только последний кадр

Я пытаюсь создать анимацию из нескольких изображений png. Вот мой код:

AnimationDrawable animation = new AnimationDrawable();

for (int i = 0; i < translate_text.length(); i++)
{
    byte[] byteArray = Base64.getDecoder().decode(client._fromServer.elementAt(i));
    Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    ImageView image = (ImageView) findViewById(R.id.sign);
    image.setImageBitmap(Bitmap.createScaledBitmap(bmp, image.getWidth(), image.getHeight(), false));
    animation.addFrame(image.getDrawable(), 1000);
}

animation.setOneShot(true);
animation.start();

но это отображает только последний кадр... Есть идеи?

Редактировать: возможно, нужно было сделать это раньше, но здесь идет:

translate_text — это строка. Он представляет собой последовательность изображений. Например, если строка «боб», то должно быть 3 изображения: буква B, буква O и буква B.

client._fromServer — это вектор строк. Каждая строка представляет собой сам образ, закодированный в base64. Вот почему client._fromServer.elementsAt(i) — это строка, которую нужно декодировать и превратить в byteArray.

Когда вы отлаживаете свой код, каково значение translate_text? Вы уверены, что получаете разные изображения на каждой итерации цикла? Что это client._fromServer.elementAt(i) (это действительно странно)?

grandouassou 02.03.2019 11:59

translate_text - это строка, в которой каждый символ представляет изображение (например, если строка "боб", то у меня будет 3 изображения: буква B, буква O и буква B). client._fromServer.elementAt(i) — это строковое представление изображения (которое закодировано в base64). и да, я действительно уверен, что он получает разные изображения на каждой итерации цикла @florian

Bines 02.03.2019 12:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, это потому, что вы получаете Drawable от одного и того же ImageView.
Когда вы это делаете image.setImageBitmap(), он обновляет ссылку Drawable в ImageView, и это также влияет на AnimationDrawable.
Вы должны использовать разные Drawable экземпляры для каждого addFrame вызова.

Что-то такое:

AnimationDrawable animation = new AnimationDrawable();
ImageView image = (ImageView) findViewById(R.id.sign);

for (int i = 0; i < translate_text.length(); i++)
{
    byte[] byteArray = Base64.getDecoder().decode(client._fromServer.elementAt(i));
    Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    final Bitmap scaledBitmap = Bitmap.createScaledBitmap(bmp, image.getWidth(), image.getHeight(), false);
    Drawable drawable = new BitmapDrawable(getResources(), scaledBitmap);
    animation.addFrame(drawable, 1000);
}

animation.setOneShot(true);
animation.start();

Я отредактировал свой ответ, чтобы он был понятнее. На опубликованном вами снимке экрана вы все еще используете тот же экземпляр изображения и, следовательно, возможность рисования. Если все еще не ясно, почему это происходит, не стесняйтесь спрашивать подробности.

grandouassou 02.03.2019 12:38

О, я кажется понял, спасибо! Я попробовал ваш код, и я думаю, что он работает, но он не отображается на экране, должен ли он быть размещен там, где находится исходный ImageView? или я должен что-то сделать, чтобы установить его координаты или что-то в этом роде?

Bines 02.03.2019 13:18

После цикла for image.setImageDrawable(animation);.

grandouassou 02.03.2019 14:03

Другие вопросы по теме