Tengo una vista personalizada que llena mi pantalla completa. (Un teclado de piano) Cuando un usuario toca la tecla, hace que se llame a invalidate()
y se vuelve a dibujar todo el teclado para mostrar el nuevo estado con una tecla tocada.Android: ¿Cómo obtener una vista personalizada para volver a dibujar parcialmente?
Actualmente la vista es muy simple, pero planeo agregar gráficos un poco más agradables. Dado que todo el teclado se procesa dinámicamente, esto haría que redibujar todo el teclado sea más caro.
Así que pensé, veamos el redibujado parcial. Ahora llamo al invalidate(Rect dirty)
con la región sucia correcta. Configuré el método onDraw(Canvas canvas)
para dibujar las claves en la región sucia solo si realmente quiero un redibujado parcial. Esto hace que esas teclas se dibujen, pero el resto del teclado está totalmente negro/no dibujado.
¿Me equivoco al esperar que al llamar al invalidate(Rect dirty)
se "guarde en caché" el canvas
actual, y solo "permita" dibujar en la región sucia?
¿Hay alguna manera de que pueda lograr lo que quiero? (Una manera de "caché" el lienzo y sólo volver a dibujar la zona sucia "
Hmm, no me gusta este solutnio porque la razón por la que sus teclas están parcialmente dibujadas es porque primero debería tener un dibujo completo de hiscanvas de todos modos. Por lo tanto, la pregunta es por qué su lienzo no dibujó correctamente en primer lugar. –
Tengo que tener en cuenta que ahora entiendo que cuando llamas 'invalidate' con un' rect' sucio, puedes simplemente usar tu código de dibujo normal, y solo debería realizar las operaciones de dibujo que están en el 'rect' sucio. 'Canvas' descarta las operaciones que están fuera del' rect'. Aún así, esto significa que gran parte de tu propio código aún se procesa y en mis pruebas con aceleración HW fue más lento que simplemente renderizar la vista por completo. – Peterdk
Tenga en cuenta que para dibujar mapas de bits en lienzo, el parámetro de pintura puede ser nulo, p. 'canvas.drawBitmap (mapa de bits, 0, 0, nulo)'. – greg7gkb