2012-08-13 23 views
22

Tengo un LinearLayout que utilizo como contenedor para algunos botones y textview que me gustaría animar a la altura de para dar una impresión de que el diseño se desliza cuando el usuario presiona un " botón "mostrar".Animación de altura del contenedor LinearLayout con ValueAnimator

He configurado LinearLayout en layout_height = "0dp" y visibility = "ido" en mi xml. Luego deseo configurarlo para que sea visible y cualquier altura que sea necesaria para envolver el contenido. En este momento estoy teniendo problemas para animarlo, sin importar la altura del contenido del wrapper.

Aquí es mi método para animación:

private void toggle(final LinearLayout v) { 
    v.setVisibility(View.VISIBLE); 
    ValueAnimator va = ValueAnimator.ofInt(0, 300); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.invalidate(); 

     } 
    }); 

    va.start(); 
} 

Tal vez el problema es cómo me he fijado la altura de la LinearLayout? ¿O estoy malinterpretando la función del ValueAnimator? He revisado las publicaciones de blog de Chet Haase, pero no contienen ningún ejemplo de animación de altura específico. Tampoco he podido encontrar y buenos ejemplos de cómo trabajar con animaciones de alto usando API de 3.0+. Me gustaría algo de ayuda en esto, gracias!

+0

¿Por qué no usar animación de diseño? –

+0

Francamente, no tengo idea de cómo usarlo y pensé que dado que solo estoy apuntando a las versiones más nuevas de la API, sería más simple usar las clases más nuevas ... Seguiré buscando cómo hacerlo con LayoutAnimation, si tiene una idea sobre cómo hacerlo, siéntase libre de publicarlo como una mejor solución :) – span

+0

¿Hay alguna razón para invalidar? – portfoliobuilder

Respuesta

57

Mirando esta publicación en el blog: http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/ Encontré que no debería usar view.invalidate() para volver a dibujar el diseño. Debería usar view.requestLayout().

Así, el código se convierte en algo parecido a esto:

ValueAnimator va = ValueAnimator.ofInt(0, height); 
    va.setDuration(700); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.requestLayout(); 
     } 
    }); 

Yo sólo quería añadir una nota sobre cómo obtener la altura de la LinearLayout así para hacer la animación dinámica. Para obtener la altura, todas las vistas deben dibujarse primero. Por eso tenemos que escuchar un evento que nos dice que el dibujo está hecho. Esto se puede hacer desde el método onResume() de esta manera (tenga en cuenta que en mi xml he declarado el contenedor para wrap_content para la altura y también está visible, ya que quiero ocultarlo desde el principio, lo hago midiéndolo):

@Override 
    public void onResume() { 
     super.onResume(); 
     final ViewTreeObserver vto = filterContainer.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       height = filterContainer.getHeight(); 
       filterContainer.setVisibility(View.GONE); 
       filterContainer.getLayoutParams().height = 0; 
       filterContainer.requestLayout(); 
       ViewTreeObserver obs = filterContainer.getViewTreeObserver(); 
       obs.removeGlobalOnLayoutListener(this); 
      } 
     }); 
    } 
+3

Esto me ayudó a descubrir cómo usar getAnimatedValue. Gracias – speedynomads

+0

Mejor funcionamiento de valor animator es que tomará valores intermedios entre el inicio y el punto final para la duración especificada y podemos actualizar nuestra altura de diseño por ese valor intermedio hasta llegar a la altura del destino. También la animación es muy suave. Gracias. –

+0

¡Muchas gracias! ¡La segunda parte de la respuesta me ayuda mucho! – Victor

Cuestiones relacionadas