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!
- Conceptos básicos de Android: ejecutar código en el subproceso de la interfaz de usuario
- Problema de Cookie de Android WebView
- Ver buscapersonas y listview
- Diferentes fling (swipe) de velocidad en diferentes dispositivos Android con la misma densidad
- Cómo usar las vistas (Mes, Día, Semana) de Android Stock Calendar en una aplicación personalizada
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?
- En la vista Web de Android, ¿puedo modificar el DOM de una página web?
- Llamar ViewGroup # addView y ViewGroup # removeView causa NullPointerException
- Las vistas agregadas a TableLayout no se muestran mediante programación
- Elemento compartido animación entre RecyclerView elemento y CollapsingToolbar dentro de la misma actividad
- ¿Por qué EditText en una vista personalizada de compuesto está reutilizando el texto introducido en otra instancia de vista compuesta?
- WebViews en ViewPager no se cargan / representan hasta que se muestra la página
- Diferencia entre setAlpha y setImageAlpha
- Cómo implementar Swipe en Android juego sin vista
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()); }
- Cómo convertir un proyecto de gradle en un proyecto de android
- Error al ejecutar exec (). Comando: Directorio de trabajo: null Entorno: null – ¿cómo ejecutar un binario en Android correctamente en un dispositivo no arraigado?