GetDrawingCache () devuelto Bitmap no actualizado

Tengo una vista personalizada que administrará cientos de eventos de dibujo secuencial definidos por el usuario. En lugar de mantener una colección de todas las actualizaciones individuales de texto, línea, forma y luego volver a dibujarlas durante cada onDraw, tomo un mapa de bits del lienzo al final de cada onDraw y luego inicio el siguiente onDraw con ese mapa de bits. Una descripción de mi problema sigue este fragmento:

public class TestView extends View implements OnTouchListener { private Paint mPaint; private Bitmap mPrevCanvas; private int mTouchCount = 0; float mX = 50f; float mY = 50f; public TestView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); this.setOnTouchListener(this); this.setDrawingCacheEnabled(true); mPaint = new Paint(); mPaint.setTextSize(30f); } @Override protected void onDraw(Canvas canvas) { if (mTouchCount == 0) { canvas.drawText("Touch screen to begin", 50f, 100f, mPaint); } else { if (mPrevCanvas != null) { canvas.drawBitmap(mPrevCanvas, 0, 0, mPaint); } canvas.drawText(Integer.toString(mTouchCount), mX, mY, mPaint); mPrevCanvas = getDrawingCache().copy(Bitmap.Config.ARGB_8888, false); } } public boolean onTouch(View arg0, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { mX = event.getX(); mY = event.getY(); mTouchCount += 1; invalidate(); } return true; } } 

Parece que está funcionando bien para el primer evento de toque, pero entonces mPrevCanvas nunca se actualiza de nuevo. Al revisar las preguntas anteriores relacionadas con getDrawingCache (), sólo getDrawingCache no se actualiza parecía relevante, pero en base a la respuesta autodescubierta de ese usuario, que al parecer no era el mismo problema.

Al ejecutar esta vista personalizada, al tocar la pantalla aparece un "1" en la posición que toque. A continuación, captura un mapa de bits del lienzo con ese "1" en el mismo. Los toques posteriores vuelven a mostrar el mapa de bits almacenado en mPrevCanvas (mostrando el "1" de nuevo en la misma posición), y luego el nuevo número que representa el evento táctil actual (por ejemplo, "2", "3", etc.) MPrevCanvas al final de cada onDraw, espero que cada onDraw empiece mostrando un mapa de bits que contenga los resultados de todos los eventos táctiles anteriores … pero por alguna razón el mapa de bits mPrevCanvas nunca se actualiza para incluir nada excepto ese evento inicial "1").

He (a) verificado que isDrawingCacheEnabled () sigue siendo cierto durante cada paso a través de onDraw; (B) intentado tirar en destroyDrawingCache () y buildDrawingCache () sin éxito; (C) mPrevCanvas forzado a null antes de la llamada a getDrawingCache () para asegurarse de que realmente se está actualizando; Y (d) buscaron en mi copia de Java de O'Reilly en una cáscara de nuez en la corazonada que quizá tengo un problema del headspace de java algo que un problema de la API de Androide.

P1: ¿Por qué getDrawingCache () sólo devolverá un mapa de bits que contenga esa primera llamada a canvas.drawText, pero nunca con los resultados de ninguna de las llamadas drawText siguientes?

Q2: Dado que lo estoy haciendo de esta manera para la eficiencia de recursos, debo estar usando algún otro patrón de diseño de todos modos?

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