Domanda

Sto cercando di disegnare un animazione. Per farlo ho esteso View e sovrascritto il metodo OnDraw (). Quello che mi aspetterei è che ogni volta OnDraw () viene chiamato la tela sarebbe nello stato che ho lasciato in e ho potuto scegliere di cancellarlo o semplicemente disegnare su parti di esso (Questo è come ha funzionato quando ho usato un SurfaceView ), ma ogni volta la tela torna già cancellata. C'è un modo che non posso averlo eliminato? O forse salvare lo stato precedente in un bitmap quindi posso solo disegnare che bitmap e quindi disegnare su di esso?

È stato utile?

Soluzione

Non sono sicuro se c'è un modo oppure no. Ma per i miei visualizzazioni personalizzate io o ridisegnare tutto ogni volta OnDraw () viene chiamato, o disegnare in una bitmap e quindi disegnare la bitmap alla tela (come da te suggerito nella tua domanda).

Ecco come lo faccio

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);
    }
}

Altri suggerimenti

si dovrebbe avere un aspetto qui per vedere la differenza tra la visione di base e SurfaceView. Un SurfaceView ha uno strato dedicato per il disegno, per cui direi che tiene traccia di ciò che hai disegnato prima. Ora, se si vuole veramente farlo su una vista di base, si potrebbe provare a mettere ogni elemento si disegna in un array, come l'esempio di overlay dettagliata per il mapview . Dovrebbe funzionare più o meno allo stesso modo

Le vostre aspettative non jib w / realtà :) La tela non sarà il modo in cui hai lasciato, ma è vuota invece. Si potrebbe creare un ArrayList di oggetti da disegnare (canvas.drawCircle (), canvas.drawBitmap (), ecc), quindi iterare anche se l'ArrayList in OnDraw (). Sono nuovo di programmazione grafica, ma ho usato questo su piccola scala. Forse c'è un modo molto migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top