¿Cómo desencadenar el redibujo de un padre Ver cuando se vuelve a dibujar alguno de sus hijos?

Fondo

He escrito una vista personalizada de Android basada en un LinearLayout que he llamado ReflectingLayout . La idea es bastante simple, para hacer un efecto de reflexión debajo de cualquier niño Vistas declaradas dentro de ReflectingLayout . p.ej..

Algo como esto

Estoy logrando esto reemplazando dispatchDraw() en ReflectingLayout siguiente manera:

 @Override protected void dispatchDraw(Canvas canvas) { Bitmap bitmap = Bitmap.createBitmap(...); Canvas tempCanvas = new Canvas(bitmap); // Draw child views to bitmap using tempCanvas super.dispatchDraw(tempCanvas); ... // some tranformations performed on bitmap ... // draw transformed image on to main canvas canvas.drawBitmap(bitmap, 0, 0, null); } 

El problema

Si mi ReflectingLayout contiene, digamos, un TextView y cambio el contenido de texto de ese TextView el efecto de reflexión no se está actualizando.

Creo que esto es porque Android sólo volverá a dibujar el propio TextView en lugar de todas las vistas de los padres, lo que significa que mi método dispatchDraw() no se llama.

¿Hay alguna forma sencilla de activar el redibujo de una vista de los padres en respuesta a los cambios en cualquiera de sus vistas secundarias?

En particular, ¿cómo puedo volver a dibujar ReflectingLayout cuando se vuelven a dibujar las vistas de los niños?

Cosas que ya he considerado

  • He notado que un nuevo View.OnLayoutChangeListener se agregó en el nivel 11 de la API. Presumiblemente, esto podría ser usado para registrar una devolución de llamada a la vista principal y desencadenar una nueva View.OnLayoutChangeListener (?). En cualquier caso, necesito una solución que funcione en API Nivel 7 hacia arriba.

  • Podría simplemente extender TextView y cualquier otra clase de View que quiera declarar dentro de ReflectingLayout para invalidar a sus padres cuando sean redibujados, pero esto es una solución torpe.

Cualquier ayuda recibida en gran medida (incluso si piensa que el enfoque general es incorrecto).

Gracias.

¿Qué pasa con el método getParent() en su vista? Algo como esto:

 if (getParent() instanceof View) ((View) getParent()).invalidate(); 

Acabo de encontrar este problema. Me di cuenta de que se debió a la nueva compatibilidad de aceleración de hardware en View#setLayerType LAYER_TYPE_SOFTWARE La forma en que lo resolví estaba usando View#setLayerType y utilizando LAYER_TYPE_SOFTWARE . Con el fin de seguir apuntando API nivel 8 he utilizado la reflexión para llamar a este método en el apoyo a las plataformas Android. Esto resolvió el problema y ahora mi ViewGroup personalizado dibuja correctamente cuando los niños son invalidados.

No sé si esto resolverá su problema exactamente pero puede ayudar a otros que también están perplejos por este problema.

Código de reflexión, muy básico:

 try { Method method = CustomViewGroup.class.getMethod("setLayerType", new Class[] { Integer.TYPE, Paint.class }); // 0x1 == LAYER_TYPE_SOFTWARE method.invoke(this, new Object[] { Integer.valueOf(0x1), null }); } catch(SecurityException e) { Log.e(TAG, "reflectSetLayerType", e); } catch(NoSuchMethodException e) { // don't care } catch(IllegalArgumentException e) { Log.e(TAG, "reflectSetLayerType", e); } catch(IllegalAccessException e) { Log.e(TAG, "reflectSetLayerType", e); } catch(InvocationTargetException e) { Log.e(TAG, "reflectSetLayerType", e); } 
  • ¿Cómo mantener la compatibilidad hacia atrás mientras utiliza la API de Android Nivel 15?
  • Quiero hacer menú de diapositivas con efecto 3D como la imagen de abajo
  • Flujo textview alrededor de la imagen
  • Ajuste del tamaño de los botones en porcentaje
  • ¿Cómo puedo ejecutar el código en el hilo de la interfaz de usuario en una prueba de Android JUnit sin una actividad?
  • Disposición de la lista vacía de Android
  • ¿Dónde puedo encontrar un tutorial de spinner wheel?
  • Android: ¿Ajusta la pantalla cuando aparece el teclado?
  • Creación de una biblioteca de interfaz de usuario de Android con un extremo frontal personalizable
  • FrameLayout primer plano con selectores
  • Cómo centrar el icono y el texto en un botón android con el ancho establecido en "fill parent"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.