2012-04-12 5 views
1

Was ist der beste Weg, um eine Animation als Live Wallpaper anzuzeigen? Im Moment habe ich eine gif aufgeteilt in 11 pngs (einer pro Rahmen) und dann mache ich geradeAndroid Live Wallpaper Animation

public Bitmap frame0; 
ArrayList<Bitmap> frameArray = new ArrayList<Bitmap>(); 
frame0 = BitmapFactory.decodeResource(getResources(), R.drawable.nyancat0); 
frame0 = Bitmap.createScaledBitmap(frame0, minWidth, minHeight, true); 
frameArray.add(frame0); 

Dann nur ich eine Schleife durch die Frames For-Schleife verwenden und zeichnen sie auf einer Leinwand

canvas.drawBitmap(frameArray.get(indexnumber), 0, 0, mPaint); 

und dann ändere ich einfach meine Indexnummer ++ es sei 11, dann gehe ich zurück zu 1. Das funktioniert, aber natürlich speichern viele Bitmaps ist sehr Speicher ineffizient. Das hindert mich daran, mehrere Schichten oder andere coole Effekte ohne Nachlaufen und Batterieverbrauch zu machen. Gibt es eine bessere Möglichkeit, eine Animation auf dem Android Live-Hintergrund anzuzeigen? Ich habe Movie versucht, um das ganze GIF anzuzeigen, aber das wird nicht für Live-Wallpaper unterstützt.

Antwort

1

Wie lange dauert das Laden von Bildern? Wenn es zu vernachlässigen ist, warum sollte man dann nicht jedes Bild direkt vor der Anzeige laden und das alte wegwerfen? Auf diese Weise haben Sie in jeder Phase nur ein Bild im Speicher.

Alternativ können Sie etwas Ähnliches wie einen Backbuffer verwenden, zwei Speicherplätze haben, einen für das Bild, das jetzt angezeigt wird, und einen anderen, in den Sie das nächste Bild laden. Wenn es Zeit zum Ändern ist, machen Sie die neu geladene Bitmap sichtbar, entladen Sie die andere und laden Sie dann das nächste Bild hinein.

+0

Ich werde es versuchen und lassen Sie wissen, wie es geht! Ziemlich einfache Idee jetzt, dass Sie es erwähnen ... – NightmareApps

0

Trotz was Leute sagen, können Sie tatsächlich eine Menge Bilder in Ihrem Live Wallpaper haben. Die einzige knifflige Sache ist das Speicherlimit. Ich hatte so viel wie 40 .png in meiner Anwendung geladen und ich lud sie einmal in einer Minute neu.

Aber wenn man, dass viele Bilder in der Anwendung der Handhabung, müssen Sie sie auf intelligente Weise laden:

public BitmapResult decodeResource(int file, int scale){ 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inPurgeable = true; 
     o.inInputShareable = true; 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(resources, file, o); 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     o2.inSampleSize=scale; 
     return new BitmapResult(BitmapFactory.decodeResource(resources, file, o2),o2.outWidth,o2.outHeight); 
} 

Sie sehen, dass die Skala Variable? Es sollte eine Potenz von 2 sein und es skaliert Ihre Bitmap.

, falls etwas falsch verstanden, die Bitmaps reinigen und neu zu laden Bitmaps mit einer niedrigeren Qualität:

void init() 
{ 
    try 
    { 
     loadFirstBitmap(); 
     loadSecondBitmap(); 
    } 
    catch(java.lang.OutOfMemoryError error) 
    { 
     /*some infinite loop breaker*/ 
     scale *= 2; 
     cleanup(); 
     init(); 
    } 
} 

Auch System nicht loswerden einen Bitmaps für Sie, haben Sie sie selbst zu reinigen und dann wahrscheinlich rufen Sie den Garbage Collector:

bitmap1.recycle(); 
bitmap2.recycle(); 
System.gc(); 

Ändern der Größe Ihre Bitmaps auf die Größe benötigen Sie ist auch eine gute Idee, weil sonst System wahrscheinlich createScaledBitmap jedes Mal, wenn Sie versuchen, nennen würde, es zu zeichnen, welche zusätzlichen Speicher erfordern würde.

Ich habe nie gedacht, was ist die Speicherkapazität für solche Art von Anwendungen ist und ist es, dass ein Speicher Heap-Limit am häufigsten entspricht 24 MB, aber ich kann Ihnen sagen, dass meine App bis zu 13 MB Speicher und niemand nimmt hat auf Android-Geräten einen Absturz gemeldet> = 2.2.

Wenn Sie also einige Optimierungsregeln befolgen, können Sie in Ihrer Anwendung so viele Bitmaps laden, wie Sie benötigen.