2010-03-11 21 views
16

Estoy intentando dibujar una animación. Para hacerlo, extendí View y anulé el método onDraw(). Lo que esperaría es que cada vez que se llame a OnDraw(), el lienzo esté en el estado en el que lo dejé y podría elegir borrarlo o simplemente dibujar partes de él (así es como funcionaba cuando usaba SurfaceView).) pero cada vez que el lienzo vuelve ya está despejado. ¿Hay alguna manera de que no pueda borrarlo? O tal vez guardar el estado anterior en un mapa de bits para que pueda dibujar ese mapa de bits y luego dibujar sobre él.Android View.onDraw() siempre tiene un lienzo limpio

Respuesta

28

No estoy seguro si hay una manera o no. Pero para mis vistas personalizadas, redibujo todo cada vez que se llama a OnDraw(), o dibujo a un mapa de bits y luego dibujo el mapa de bits en el lienzo (como sugirió en su pregunta).

Aquí es cómo lo hago

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

¡Ya lo descubrí hace un momento! ¡Gracias por el aporte! – CaseyB

+0

Dibujar en el búfer funciona bien, pero este método drawBitmap() consume muchos FPS :( –

+0

Es un cuello de botella para mí ahora mismo: dibujar un mapa de bits en pantalla completa en onDraw cada vez para restaurar el estado anterior apenas afecta los FPS para dispositivos de alta resolución (como Kindle 8.9 tercera generación con 2560x1600). ¿Realmente no hay forma de forzar que el lienzo persista en su estado anterior? Profundizar en OpenGL probablemente solucione el problema de rendimiento, sin embargo, no es el camino por el momento. –

1

debe tener un aspecto here para ver la diferencia entre la vista básica y surfaceView. Un SurfaceView tiene una capa dedicada para dibujar, que supongo que hace un seguimiento de lo que dibujaste antes. Ahora, si realmente desea hacerlo en una Vista básica, podría intentar colocar cada elemento que dibuje en una matriz, como el ejemplo de itemized overlay for the mapview. Debería funcionar más o menos de la misma manera

+0

Vi esa página. De hecho, esa página me llevó a utilizar SurfaceView inicialmente, pero luego descubrí que SurfaceView no puede tener un fondo transparente. y necesito este widget para poder sentarme encima de otras vistas. – CaseyB

+0

luego prueba la matriz de dibujable? – Sephy

+0

En Android moderno puede usar una vista de textura si desea ir a la ruta OpenGL. – Adam

0

Sus expectativas no foque w/realidad :) El lienzo no será la forma en que lo dejó, pero en blanco en lugar. Puede crear una ArrayList de objetos para dibujar (canvas.drawCircle(), canvas.drawBitmap() etc.), luego iterar a través de ArrayList en OnDraw(). Soy nuevo en la programación de gráficos, pero lo he usado a pequeña escala. Tal vez hay una manera mucho mejor.

+0

Es si crea el lienzo. De esta manera, usted tiene el control total sobre lo que se siente atraído. – CaseyB

+0

En lugar de un Arraylist: puede usar la clase Picture para grabar llamadas de dibujo. –

Cuestiones relacionadas