Проблема в AnimationDrawable андроид студии - PullRequest
0 голосов
/ 28 января 2019

У меня есть анимационная анимация, которую я хочу, но та же анимационная анимация в двух изображенияхПроблема первая не работает, а вторая работает.

AnimationDrawable animation1 = new AnimationDrawable();
Bitmap bitmapba1 = BitmapFactory.decodeResource(getResources(),R.drawable.a);
Bitmap bitmapba2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);
bitmapba1=Bitmap.createScaledBitmap(bitmapba1,x,x,false);
bitmapba2=Bitmap.createScaledBitmap(bitmapba2,x,x,false);
animation1.addFrame(new BitmapDrawable(bitmapba1), 20);
animation1.addFrame(new BitmapDrawable(bitmapba2), 20);
myimage1.setImageDrawable(animation1);
myimage2.setImageDrawable(animation1);

Проблема решена, но неэффективна (примитив) Я объявил второй animation2 такими же bitmapba1 и bitmapba2: animation2.addFrame (... (bitmapba1), 20) и animation2.addFrame (... (bitmapba2), 20).

Вопрос в том, что делать, если существует 100 изображений, которые используют один и тот же animationdrawable?

1 Ответ

0 голосов
/ 29 января 2019

Как писал Style-7 , для каждого экземпляра ImageView вы должны создать свой собственный экземпляр AnimationDrawable.Проблема в том, что экземпляр AnimationDrawable имеет свое собственное состояние.Это состояние «разрывается», как только вы разделяете этот единственный экземпляр между несколькими представлениями.

Но вы не должны сохранять копию растровых изображений для каждой анимации.Загрузите их один раз, а затем просто настройте анимацию.

Bitmap bitmapba1 = BitmapFactory.decodeResource(getResources(),R.drawable.a);
Bitmap bitmapba2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);
bitmapba1=Bitmap.createScaledBitmap(bitmapba1,x,x,false);
bitmapba2=Bitmap.createScaledBitmap(bitmapba2,x,x,false);

for(ImageView view : listOfViews){
    AnimationDrawable animation = new AnimationDrawable();
    animation.addFrame(new BitmapDrawable(bitmapba1), 20);
    animation.addFrame(new BitmapDrawable(bitmapba2), 20);
    view.setImageDrawable(animation);
}

Мы также должны создать новый экземпляр BitmapDrawable для каждого экземпляра анимации, поскольку он также имеет свое собственное состояние.Но каждый такой новый экземпляр просто сохраняет ссылку на объект Bitmap и не копирует растровые данные для каждого нового.

...