Android View.onDraw () siempre tiene un canvas limpio

Estoy tratando de 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 canvas 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 canvas vuelve ya está despejado. ¿Hay alguna manera de que no pueda borrarlo? O tal vez guardar el estado anterior en un bitmap para que pueda dibujar ese bitmap y luego dibujar sobre él.

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 bitmap y luego dibujo el bitmap en el canvas (como sugirió en su pregunta).

Así es como 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); } } 

deberías echar un vistazo aquí 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 quieres hacerlo en una Vista básica, podrías intentar colocar cada elemento que dibujas en una matriz, como el ejemplo de una superposición detallada para la vista de mapa . Debería funcionar más o menos de la misma manera

Sus expectativas no son jib w / reality 🙂 El canvas no será la forma en que lo dejó, pero en blanco en su 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 progtwigción de gráficos, pero lo he usado a pequeña escala. Tal vez hay una manera mucho mejor.