Я пытаюсь создать анимацию из нескольких изображений 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 - это строка, в которой каждый символ представляет изображение (например, если строка "боб", то у меня будет 3 изображения: буква B, буква O и буква B). client._fromServer.elementAt(i) — это строковое представление изображения (которое закодировано в base64). и да, я действительно уверен, что он получает разные изображения на каждой итерации цикла @florian




Я думаю, это потому, что вы получаете 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();
Я отредактировал свой ответ, чтобы он был понятнее. На опубликованном вами снимке экрана вы все еще используете тот же экземпляр изображения и, следовательно, возможность рисования. Если все еще не ясно, почему это происходит, не стесняйтесь спрашивать подробности.
О, я кажется понял, спасибо! Я попробовал ваш код, и я думаю, что он работает, но он не отображается на экране, должен ли он быть размещен там, где находится исходный ImageView? или я должен что-то сделать, чтобы установить его координаты или что-то в этом роде?
После цикла for image.setImageDrawable(animation);.
Когда вы отлаживаете свой код, каково значение
translate_text? Вы уверены, что получаете разные изображения на каждой итерации цикла? Что этоclient._fromServer.elementAt(i)(это действительно странно)?