2012-03-14 10 views
16

En mi aplicación hay un LinearLayout que tiene 0 altura de diseño. Cuando hago clic en el botón, esta altura de diseño debe ser LayoutParams.WRAP_CONTENT. Este es el código que uso en onclicklistner.Animación al cambiar LayoutParams en LinearLayout

LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
slider.setLayoutParams(lp); 

Quiero animar esto. ¿Cómo puedo configurar la animación en el control deslizante?

+1

¿quieres animación en el control deslizante? –

+0

@Nixit Patel sí – Chrishan

+0

@NixitPatel: ¿Desea implementar la animación del control deslizante? –

Respuesta

25

Creo que lo que desea es animar una vista desde 0 a la altura de su altura final, se puede hacer esto con una animación personalizada:

public class ShowAnim extends Animation { 
    int targetHeight; 
    View view; 

    public ShowAnim(View view, int targetHeight) { 
     this.view = view; 
     this.targetHeight = targetHeight; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     view.getLayoutParams().height = (int) (targetHeight * interpolatedTime); 
     view.requestLayout(); 
    } 

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

    @Override 
    public boolean willChangeBounds() { 
     return true; 
    } 
} 

Y hacer esto en su código para iniciar la animación:

Animation ani = new ShowAnim(headerView, 100/* target layout height */); 
ani.setDuration(2000/* animation time */); 
headerView.startAnimation(ani); 
+1

¿Cómo se hace esto sin que comience a una altura de cero cada vez? Si hago esto una vez con una altura de diseño objetivo de 100, y luego otra vez con un tiempo de diseño objetivo de 200, quiero que vaya de 0 -> 100 y luego 100 -> 200. – Andrew

+0

Si quiere pasar de 100 - > 200, entonces simplemente modifica esta línea 'view.getLayoutParams(). Height = (int) (targetHeight * interpolatedTime);' a algo como 'view.getLayoutParams(). Height = initialHeight/* 100 en tu caso */+ (int) (targetHeight/* 200 en su caso */- initialHeight * interpolatedTime); ' – Kai

+1

Una cosa que no funciona es que no sucede nada cuando la HeightHeight inicial es 0. No hay ningún cambio visual en absoluto. – Andrew

1

ya que tenemos las transiciones de diseño en Android desde JELLYBEAN podemos utilizar que en lugar de utilizar el objeto de animación.

El artículo siguiente lo explica en detalle. https://proandroiddev.com/the-little-secret-of-android-animatelayoutchanges-e4caab2fddec

En resumen, sólo necesitaríamos este código -

tView.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING); 
tView.setLayoutParams(lp); 

Aquí lp sería la disposición params

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams 
          (RelativeLayout.LayoutParams.MATCH_PARENT, newHeight); 

Una cosa más para agregar sería añadir esta línea en el diseño archivo, al diseño que estaría haciendo la transición.

android:animateLayoutChanges="true" 
Cuestiones relacionadas