¿Dónde desasignar correctamente el mapa de bits en Android View?
Tengo una vista personalizada, que dibuja un montón de cosas, incluyendo mapas de bits. Quiero almacenar en caché este dibujo en un mapa de bits, de modo que sólo necesito dibujar un solo mapa de bits dentro de onDraw, en lugar de repetir estas tareas de dibujo y cálculo.
Los mapas de bits se deben reciclar después de que ya no lo utilice. No veo onDestroy () ni nada remotamente similar en la clase View. ¿Hay un método de devolución de llamada que pueda anular para lograr esto?
- ¿Cómo obtener el lienzo actual?
- Android ListView en el widget onClick no funciona
- ¿Cuál es la forma correcta de comunicarse desde una Vista personalizada a la Actividad en la que reside?
- Cómo configurar el tamaño de la vista de superficie personalizada
- Cómo obtener la altura de la vista dentro del adaptador para crear bitmap de tamaño?
public void <insert_callback_here>() { cachedBitmap.recycle(); }
No hay animación. Esta es una imagen estática. Hay un montón de cálculos hechos para dibujar la imagen, así que prefiero hacerlo una vez en onMeasure ().
- ¿Cómo encontrar id de la vista en appwidgetprovider?
- Error de WebView. Haciendo una aplicación para Android para ver mi sitio web
- ¿Por qué obtengo una excepción de puntero nulo de TabWidget?
- Android: ¿Cómo pasar mejor los datos a una vista?
- ¿Cómo puedo ver que View se vuelve visible
- Diferencia entre vista y subvista - Android
- MPandroidChart: permite acercar y alejar los valores sólo en el eje Y
- Android ExpandableListView - establece cierto grupo para no expandible
Voy a contestar la mía aquí. Los métodos adecuados para anular es onDetachedFromWindow
. Desasigno mi mapa de bits dentro de onDetachedFromWindow
y los onMeasure
dentro de onMeasure
si el ancho o la altura han cambiado.
@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (cachedBitmap != null && !cachedBitmap.isRecycled()) { cachedBitmap.recycle(); cachedBitmap = null; cachedBitmapWidth = -1; cachedBitmapHeight = -1; } } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int viewWidth = MeasureSpec.getSize(widthMeasureSpec);; int viewHeight = MeasureSpec.getSize(heightMeasureSpec);; if (cachedBitmapWidth != viewWidth || cachedBitmapHeight != viewHeight) { if (cachedBitmap != null) { cachedBitmap.recycle(); } cachedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); cachedBitmapWidth = viewWidth; cachedBitmapHeight = viewHeight; Canvas canvas = new Canvas(cachedBitmap); // do drawings here.. } setMeasuredDimension(viewWidth, viewHeight); }
- La barra de estado no es transparente cuando se utiliza una nueva biblioteca de diseño de soporte
- Respetar la escala de duración del animador en la propia animación