2012-03-28 5 views
3

Also habe ich eine Animation, die erstellt wird, indem eine Reihe von Bitmaps in der onDraw() -Methode einer benutzerdefinierten Ansicht gezeichnet wird. Es gibt einen Update-Thread, der eine Methode in der benutzerdefinierten Ansicht aufruft, die die Positionen der Bitmaps ändert, die von der onDraw() -Methode gezeichnet werden sollen. Ich möchte die Bitmap speichern, die jedes Mal erstellt wird, wenn der Update-Thread fertig ist, damit ich aus den Bitmaps, die ich speichere, ein gif erstellen kann.Bitmap aus der benutzerdefinierten Ansicht speichern, die eine Animation über die onDraw-Methode hat

fand ich den Code unten ein png von einem Bitmap-Speicher auf die SD-Karte zu speichern und das funktioniert mit einer gespeicherten Bitmap, aber ich habe Probleme mit getDrawingCache():

public void saveView(){ 
    if(counter < 200){ 
     try { 
      counter++; 
      System.out.println("Counter : " + counter); 
      File file = new File(path, "star"+counter+".png"); 
      file.delete(); 
      OutputStream fOut = new FileOutputStream(file); 
      buildDrawingCache(); 
      getDrawingCache().compress(Bitmap.CompressFormat.PNG, 100, fOut); 
      destroyDrawingCache(); 
      fOut.flush(); 
      fOut.close(); 
      MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

dies tun im Wesentlichen tut zwei Dinge im Moment:

1) Es dauert etwa 50 Bilder und speichert sie auf der SD-Karte. @ rund 50 es verursacht den Heap zu groß (ich denke, dass destroyDrawingCache() ist nicht in der Lage, tatsächlich zu beenden, ist dies in einem separaten Thread)

2) In den aufgenommenen Bildern können Sie die Scan-Zeilen aus der Pufferaktualisierung, weil ich von einem Puffer nehme, der aktualisiert wird.

Es scheint, dass der getDrawingCache auch onDraw() aufruft, weshalb ich das nicht auf dem UI-Thread in der onDraw selbst haben kann.

Wenn dies möglich ist bitte helfen.

+0

Wird 'saveView()' im UI-Thread aufgerufen? –

+0

no ist es in einem neuen Thread jedes Mal, wenn der onDraw aufgerufen wird. – L7ColWinters

Antwort

1

Sie sollten getDrawingCache() nicht von außerhalb des UI-Threads aufrufen. Aus diesem Grund haben die Bitmaps, die Sie erhalten, teilweise aktualisierte Scan-Zeilen. Rufen Sie saveView() direkt von onDraw(). Nach dem Klonen der zwischengespeicherten Bitmap können nur die Dateioperationen in separaten Threads ausgeführt werden.

Hinweis: Sie können setDrawingCacheEnabled(true) anrufen? so dass Sie buildDrawingCache() und destroyDrawingCache() nicht anrufen müssen. Auch wenn auf Ihrem Gerät die Hardwarebeschleunigung aktiviert ist, müssen Sie setLayerType(LAYER_TYPE_SOFTWARE, null) anrufen.

Eine andere Lösung besteht darin, die Bitmap zu erhalten, indem Sie View.draw(android.graphics.Canvas) auf einer neuen Zeichenfläche aufrufen, die eine leere Bitmap enthält.

+0

Wenn ich den Code aus dem UI-Thread ausführen, bekomme ich immer das gleiche Bild, es ändert sich nie. Das ist mit setDrawingCacheEnabled (true) anstelle der anderen. – L7ColWinters

+0

mit der View.draw (Leinwand) war die Route, die ich tun musste. Im Grunde habe ich saveView von der Update-Methode aufgerufen. Innerhalb von saveview habe ich eine temporäre Bitmap erstellt und die erstellte Bitmap manuell von draw (canvas) erstellt, dann freigegeben und in sd gespeichert. – L7ColWinters

+0

Ich erweiterte Bildumschalter, um Bildschirme zu erfassen, während ich in der Animation OverDraw() -Methode überschrieb. Es macht Bilder wie erforderlich, aber es zeichnet meine Ansicht nicht (nur einige Male blinkend) und animiert überhaupt nicht. Ich frage mich, wie es möglich ist, Bilder zu erfassen, aber nicht richtig zu zeichnen. Bitte helfen Sie. –

Verwandte Themen