Android: ¿Cómo obtener una vista personalizada para volver a dibujar parcialmente?

Tengo una vista personalizada que llena toda mi pantalla. (Un teclado de piano) Cuando un usuario toca la tecla, hace que invalidate() sea ​​llamado y todo el teclado se vuelve a dibujar para mostrar el nuevo estado con una tecla tocada.

Actualmente la vista es muy simple, pero pienso agregar gráficos un poco más agradables. Dado que todo el teclado se renderiza dinámicamente esto haría redibujar todo el teclado más caro.

Así que pensé, echemos un vistazo al redibujo parcial. Ahora llamo invalidate(Rect dirty) con la región sucia correcta. Puse mi onDraw(Canvas canvas) para dibujar solamente las llaves en la región sucia si realmente deseo un redibujo parcial. Esto da como resultado que las claves sean dibujadas, pero el resto del teclado es totalmente negro / no dibujado en absoluto.

¿Estoy equivocado al esperar que la llamada invalidate(Rect dirty) "almacenara" el canvas actual, y sólo "permita" dibujar en la región sucia?

¿Hay alguna manera de lograr lo que quiero? (Una manera de "caché" el lienzo y sólo redibujar el área sucia? "

    Solución alternativa actual es manualmente en caché el lienzo completo a un mapa de bits:

      private void onDraw(Canvas canvas) { if (!initialDrawingIsPerformed) { this.cachedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); //Change to lower bitmap config if possible. Canvas cacheCanvas = new Canvas(this.cachedBitmap); doInitialDrawing(cacheCanvas); canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint()); initialDrawingIsPerformed = true; } else { canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint()); doPartialRedraws(canvas); } } 

    Por supuesto, usted necesita almacenar la información sobre qué redibujar usted mismo y preferiblemente no utilizar una nueva Paint cada vez, pero que son detalles.

    También tenga en cuenta: Los mapas de bits son bastante pesados ​​en el uso de memoria de su aplicación. Tuve accidentes cuando me caché una vista que se utiliza con un scroller y que era como 5 veces la altura del dispositivo, ya que utiliza> 10MB de memoria!

    Para complementar la respuesta de Peterdk, puede guardar sus operaciones en una imagen en lugar de un mapa de bits.

    • Un mapa de bits guardará todos los píxeles, como dijo que podría tomar mucha memoria.
    • Una imagen guardará las llamadas, como drawRect, drawLine, etc.

    Depende de lo que es realmente pesado en su aplicación: un montón de operaciones de dibujo, algunas operaciones de dibujo, pero controlado por cálculos pesados, un montón de espacios en blanco / no utilizados (prefieren la imagen) etc …

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.