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.
- Formato personalizado editar entrada de texto android para aceptar número de tarjeta de crédito
- Icono contador en android
- Evite pasar null como raíz de vista (necesita resolver los parámetros de diseño en el elemento raíz del diseño hinchado)
- El botón onclick dentro del fragmento no funciona
- Obtener el margen de una vista
<?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!
- ¿Hacer que la vista vacía ocupe el espacio restante después de RecyclerView?
- ¿Qué carpetas de diseño son necesarias para admitir todos los dispositivos Android?
- Forma del androide con el movimiento inferior
- Android emulador de AVD en Eclipse muestra pantalla en negro y "android"
- ¿Cómo detectar un tablet en Android?
- ¿Tenemos alguna herramienta para convertir el diseño xml de Android a archivos .java?
- Android: Agregar una vista de forma programática omite algunos atributos de estilo
- View.getWidth () no funciona en el método onCreate?
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"