Frage

Ich versuche, eine Animation zu zeichnen. Um dies zu tun habe ich Ansicht erweitert und die OnDraw () -Methode außer Kraft gesetzt. Was ich würde erwarten, ist, dass jedes Mal OnDraw () wird die Leinwand genannt in dem Zustand sein würde, dass ich es links in und ich konnte wählen, um es zu löschen oder nur über Teile davon ziehen (Dies ist, wie es funktioniert, wenn ich ein Surface verwendet ), aber jedes Mal, wenn die Leinwand bereits gelöscht kommt zurück. Gibt es eine Möglichkeit, dass ich es nicht gelöscht haben? Oder vielleicht den vorherigen Zustand in eine Bitmap speichern, so kann ich nur, dass Bitmap zeichnen und dann über oben drauf ziehen?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob es einen Weg gibt, oder nicht. Aber für meine benutzerdefinierten Ansichten entweder ich alles neu zu zeichnen jedes Mal OnDraw () aufgerufen wird, oder in eine Bitmap zeichnen und dann die Bitmap zeichne auf die Leinwand (wie Sie in Ihrer Frage vorgeschlagen).

Hier ist, wie ich es tun

class A extends View {

    private Canvas canvas;
    private Bitmap bitmap;

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if (bitmap != null) {
            bitmap .recycle();
        }
        canvas= new Canvas();
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvas.setBitmap(bitmap);
    }
    public void destroy() {
        if (bitmap != null) {
            bitmap.recycle();
        }
    }
    public void onDraw(Canvas c) {
      //draw onto the canvas if needed (maybe only the parts of animation that changed)
      canvas.drawRect(0,0,10,10,paint);

      //draw the bitmap to the real canvas c
      c.drawBitmap(bitmap, 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
    }
}

Andere Tipps

Sie sollten einen Blick hier die Differenz zwischen Basisansicht und Surface zu sehen. Ein Surface verfügt über eine eigene Schicht für Zeichnung, die ich Spur annehmen hält, was Sie vor zog. Nun, wenn Sie es wirklich auf eine grundlegende Ansicht tun wollen, könnten Sie versuchen, jedes Element, das Sie in einem Array ziehen zu setzen, wie die exemple von aufgeschlüsselt Overlay für die mapview . Es sollte so ziemlich die gleiche Art und Weise funktioniert

Ihre Erwartungen jib nicht w / Realität :) Die Leinwand wird den Weg nicht Sie es verlassen haben, aber es leer statt. Sie könnten eine Arraylist von Objekten erstellen zu erstellenden (canvas.drawCircle (), canvas.drawBitmap () etc.), dann durchlaufen, obwohl die Arraylist in der OnDraw (). Ich bin Grafikprogrammierung neu, aber ich habe dies auf einem kleinen Maßstab verwendet. Vielleicht gibt es einen viel besseren Weg.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top