LinearyLayout no cambiará el tamaño una vez que su altura sea 0

Tengo una extraña. He conseguido llevarlo a un ejemplo muy simple. Realmente no puedo entenderlo.

Tengo un LinearLayout dentro de LinearLayout. Quiero cambiar el tamaño del niño usando una animación (que tengo un trabajo de tratar, a veces). Aquí está mi XML de diseño.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- Lots more controls will appear above --> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:id="@+id/animation_subject"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:gravity="center" /> </LinearLayout> <!-- Lots more controls will appear below --> </LinearLayout> <Button android:text="Slide it Down!" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="btnDoAnimDown_OnClick" /> </LinearLayout> 

Ahora, Como puede ver, hay un botón, y aquí está el código para ese botón.

 public void btnDoAnimDown_OnClick(View v) { View pnlSlider = findViewById(R.id.animation_subject); pnlSlider.measure(1000, 1000); DropDownAnim anim = new DropDownAnim(pnlSlider, pnlSlider.getMeasuredHeight(), true); anim.setDuration(2000); pnlSlider.startAnimation(anim); return; } 

Si lo fuese a ejecutar ahora, no se deslizaría hacia abajo. En absoluto. Sin embargo, si tuviera que mover el botón en el LinearLayout que he llamado Resumen y ponerlo después de que el niño LinearLayout, funciona un regalo! Me gusta esto…

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- Lots more controls will appear above --> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:id="@+id/animation_subject"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:gravity="center" /> </LinearLayout> <!-- Lots more controls will appear below --> <Button android:text="Slide it Down!" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="btnDoAnimDown_OnClick" /> </LinearLayout> </LinearLayout> 

Ahora se desliza hacia abajo, exactamente como se esperaba. Es evidente que algo va con el diseño de los padres … Como getMeasuredHeight () devuelve el valor correcto, es sólo la animación en realidad no se ejecuta!

Esta es la clase de animación, ¿me estoy perdiendo algo tonto? ¡Probablemente estoy!

 import android.util.Log; import android.view.View; import android.view.animation.Animation; import android.view.animation.Transformation; public class DropDownAnim extends Animation { int targetHeight; View view; boolean down; public DropDownAnim(View view, int targetHeight, boolean down) { this.view = view; this.targetHeight = targetHeight; this.down = down; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { int newHeight; if (down) { newHeight = (int) (targetHeight * interpolatedTime); } else { newHeight = (int) (targetHeight * (1 - interpolatedTime)); } Log.d("new height", String.valueOf(newHeight)); view.getLayoutParams().height = newHeight; view.requestLayout(); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, ((View)view.getParent()).getWidth(), parentHeight); } @Override public boolean willChangeBounds() { return true; } } 

¡Cualquier ayuda sería fantástica!

No sé por qué su código no quiere hacer la animación. Pero lo arreglé con un pequeño cambio. Lo que hice fue aplicar la animación al diseño padre y no al diseño que estás transformando. Aquí está el código del xml, sólo agregué una identificación al diseño padre:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/animation_subject_parent" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- Lots more controls will appear above --> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:id="@+id/animation_subject"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:gravity="center" /> </LinearLayout> <!-- Lots more controls will appear below --> </LinearLayout> <Button android:text="Slide it Down!" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="btnDoAnimDown_OnClick" /> </LinearLayout> 

Y aquí está el código del botón clic:

 public void btnDoAnimDown_OnClick(View v) { View pnlSlider = findViewById(R.id.animation_subject); View parent = findViewById(R.id.animation_subject_parent); pnlSlider.measure(1000, 1000); DropDownAnim anim = new DropDownAnim(pnlSlider, pnlSlider.getMeasuredHeight(), true); anim.setDuration(2000); parent.startAnimation(anim); return; } 

Déjeme dar una conjetura aquí.

En su primer diseño, el diseño interior y el botón comparten la representación lineal externa.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- Lots more controls will appear above --> <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:id="@+id/animation_subject"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:gravity="center" /> </LinearLayout> <!-- Lots more controls will appear below --> </LinearLayout> <Button android:text="Slide it Down!" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="btnDoAnimDown_OnClick" /> </LinearLayout> 

¡Lo que hace que el diseño externo sea un ViewGroup!

Pero en el método initialize de su animación usted hace un molde en el padre de la opinión dada.

Se echa a Ver, que no está en su 1er diseño.

En su segundo es, y thats por qué su funcionamiento.

Así que me gustaría que le diera una oportunidad de casting a ViewGroup en su lugar:

 @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, ((ViewGroup)view.getParent()).getWidth(), parentHeight); } 

No estoy seguro de si ayudará, pero trate de añadir android:layout_weight="1" a LinearLayout con id="@+id/animation_subject"

  • ActionBar Acción Elementos que no se muestran
  • Android: CollapsingToolbarLayout centra el texto expandido pero no el texto contraído
  • Cómo hacer scrollViewer ListView, pero no para llenar toda la pantalla?
  • ¿Cómo hacer que el diseño con View llene el espacio restante?
  • Cómo centrar una vista usando RelativeLayout?
  • Cómo dibujar la imagen en la esquina inferior derecha del lienzo?
  • El título personalizado de AlertDialog tiene un borde negro
  • Deshabilitar los gestos en PagerAdapter / ViewPager
  • ¿Cómo usar Android ViewPager?
  • Fragmento de NavigationDrawer con ListView y encabezado personalizado
  • ¿Cómo detectar el golpe a la izquierda oa la derecha en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.