Forzar el reajuste en un grupo de vista incluyendo todos sus hijos

Estoy escribiendo un diseño personalizado (que se extiende FrameLayout ) que se puede FrameLayout . Todos sus hijos son también vistas personalizadas que realmente obtendría el factor de escala de sus padres a través de un método getter y escala en consecuencia al establecer las dimensiones escaladas como

 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); float scaleFactor = ((CustomLayout) getParent()).getCurrentScale(); setMeasuredDimension((int) (getMeasuredWidth() * scaleFactor), (int) (getMeasuredHeight() * scaleFactor)); } 

Estoy usando un ScaleGestureDetector para detectar el gesto de "pinch to zoom" y cambiar el scaleFactor del layout. Luego forzar un diseño en el diseño personalizado llamando requestLayout . Desafortunadamente esto no parece tener ningún efecto en sus niños. El onMeasure & onLayout los niños nunca se llama a pesar de que el padre pasa por su ciclo de medición y diseño. Pero, si llamo directamente requestLayout a uno de los niños, sólo que el niño se escala de acuerdo con el factor de escala establecido en el padre!

Parece que a menos que requestLayout se requestLayout exclusivamente a una vista, en realidad no se mide de nuevo y en su lugar utiliza algún tipo de caché. Esto es evidente en el código fuente para la vista que dice

 if (mAttachInfo != null && mAttachInfo.mViewRequestingLayout == null) { // Only trigger request-during-layout logic if this is the view requesting it, // not the views in its parent hierarchy ViewRootImpl viewRoot = getViewRootImpl(); if (viewRoot != null && viewRoot.isInLayout()) { if (!viewRoot.requestLayoutDuringLayout(this)) { return; } } mAttachInfo.mViewRequestingLayout = this; } 

¿Cómo forzar a los niños a que también vayan a medirse nuevamente al llamar a requestLayout en su padre?

Esto obligará a retransmitir a los hijos de la vista (dado que el propio ancho y altura de la vista no necesita cambiar)

 private static void relayoutChildren(View view) { view.measure( View.MeasureSpec.makeMeasureSpec(view.getMeasuredWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(view.getMeasuredHeight(), View.MeasureSpec.EXACTLY)); view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); } 
  • Android: Círculo de dibujo con el interior del texto
  • El método no estático 'getSharedPreferences (java.lang.String, int)' no se puede referenciar desde un contexto estático
  • Android Imageview rellena el ancho de la pantalla
  • ¿Por qué se extiende ImageView marcado como error?
  • ¿Qué es android: layout_marginStart
  • La superposición de una vista no deshabilita las acciones en la vista subyacente
  • Android - Cómo superponer un camino encima de otro
  • ¿Cuál es la diferencia entre los estados seleccionados, seleccionados y activados en Android?
  • Establecer colores predeterminados en la biblioteca de Android
  • Cambiar el color del icono de desbordamiento de la barra de herramientas
  • Android: Transparente WebView sobre previsualización de cámara
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.