animationDrawable отображает только последний кадр - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь создать анимацию из нескольких изображений 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 - это строка.Он представляет последовательность изображений.Например, если строка «bob», тогда должно быть 3 изображения: буква B, буква O и буква B.

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

1 Ответ

0 голосов
/ 02 марта 2019

Я думаю, это потому, что вы получаете 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();
...