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
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);
}
}
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
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
luego prueba la matriz de dibujable? – Sephy
En Android moderno puede usar una vista de textura si desea ir a la ruta OpenGL. – Adam
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.
Es si crea el lienzo. De esta manera, usted tiene el control total sobre lo que se siente atraído. – CaseyB
En lugar de un Arraylist: puede usar la clase Picture para grabar llamadas de dibujo. –
- 1. View.onDraw() --- ¿cuándo se llama?
- 2. Voltear un lienzo de Android
- 3. Android: dibujar un lienzo en un ImageView
- 4. FREETEXTTABLE siempre tiene un rango de 0
- 5. Desplazar un lienzo suavemente en Android
- 6. git pull del directorio limpio tiene conflictos de combinación
- 7. Cómo medir un lienzo que tiene altura y ancho automáticos
- 8. View.invalidate() no parece llamar a View.onDraw()
- 9. Android crear capas en lienzo
- 10. Similitudes entre el lienzo HTML5 y el lienzo de Android
- 11. Cómo dibujar un triángulo relleno en un lienzo Android?
- 12. Android: medir la altura del texto en un lienzo
- 13. Android Activity.getParent() siempre volviendo nula
- 14. DataGridView que siempre tiene una fila seleccionada
- 15. ¿Tiene requestCode en PendingIntent siempre compatible?
- 16. ¿Cómo incluir un objetivo limpio en Makefile?
- 17. Android WebView canGoBack siempre verdadero
- 18. ¿Tiene Stream.Dispose siempre llame Stream.Close (y Stream.Flush)
- 19. Android onActivityResult siempre es 0
- 20. ¿Cómo hacer un ciclo asincrónico limpio?
- 21. mvn limpio sin dependencias
- 22. Lienzo de escala en Android Bitmap
- 23. Rotación de imagen en un lienzo en Android
- 24. ¿Cómo hacer un pincel personalizado para lienzo en Android?
- 25. Envoltura larga de texto en un lienzo de Android
- 26. Dibujando Nueve Parches en Lienzo (Android)
- 27. Android - DrawLine de lienzo dentro de ImageView
- 28. El lienzo de Android se congela
- 29. lienzo transparente de Android (vista de superficie)
- 30. Android LocationManager.isProviderEnabled() siempre devuelve falso
¡Ya lo descubrí hace un momento! ¡Gracias por el aporte! – CaseyB
Dibujar en el búfer funciona bien, pero este método drawBitmap() consume muchos FPS :( –
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. –