2010-04-24 21 views
5

Tengo una simple ListView lista de resultados en android. Al hacer clic en cada elemento, me gustaría que se deslice hacia abajo expandir y mostrar el contenido. ¿Hay alguna manera fácil de hacer esto en Android?Deslizar expandir animación en android

Cualquier ayuda será apreciada.

Respuesta

3

mira esto answer. más que eso, tienes que usar la animación de tweed. verifique los ApiDemos/Animation2 ejemplos. y también vea la carpeta anim en ApiDemos. me ayuda mucho según su pregunta, slide_top_to_bottom lo ayudará.

5

Aquí está el ejemplo de Udinic. Había elemento listview ampliar con la animación y requieren nivel de API única 4+ Básicamente se necesita una clase de animación

/** 
* This animation class is animating the expanding and reducing the size of a view. 
* The animation toggles between the Expand and Reduce, depending on the current state of the view 
* @author Udinic 
* 
*/ 
public class ExpandAnimation extends Animation { 
    private View mAnimatedView; 
    private LayoutParams mViewLayoutParams; 
    private int mMarginStart, mMarginEnd; 
    private boolean mIsVisibleAfter = false; 
    private boolean mWasEndedAlready = false; 

    /** 
* Initialize the animation 
* @param view The layout we want to animate 
* @param duration The duration of the animation, in ms 
*/ 
    public ExpandAnimation(View view, int duration) { 

     setDuration(duration); 
     mAnimatedView = view; 
     mViewLayoutParams = (LayoutParams) view.getLayoutParams(); 

     // decide to show or hide the view 
     mIsVisibleAfter = (view.getVisibility() == View.VISIBLE); 

     mMarginStart = mViewLayoutParams.bottomMargin; 
     mMarginEnd = (mMarginStart == 0 ? (0- view.getHeight()) : 0); 

     view.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     super.applyTransformation(interpolatedTime, t); 

     if (interpolatedTime < 1.0f) { 

      // Calculating the new bottom margin, and setting it 
      mViewLayoutParams.bottomMargin = mMarginStart 
        + (int) ((mMarginEnd - mMarginStart) * interpolatedTime); 

      // Invalidating the layout, making us seeing the changes we made 
      mAnimatedView.requestLayout(); 

     // Making sure we didn't run the ending before (it happens!) 
     } else if (!mWasEndedAlready) { 
      mViewLayoutParams.bottomMargin = mMarginEnd; 
      mAnimatedView.requestLayout(); 

      if (mIsVisibleAfter) { 
       mAnimatedView.setVisibility(View.GONE); 
      } 
      mWasEndedAlready = true; 
     } 
    } 
} 

Y utilizar este:

View toolbar = view.findViewById(R.id.toolbar); 

       // Creating the expand animation for the item 
       ExpandAnimation expandAni = new ExpandAnimation(toolbar, 500); 

       // Start the animation on the toolbar 
       toolbar.startAnimation(expandAni); 

ExpandAnimationExample

+0

Para ser votante, debe dejar la razón por la que rechaza mi respuesta. Sé que mi respuesta se puede considerar solo como respuesta de enlace, pero ¿qué es lo que quieres? Esperas que copie todo el archivo en ese repositorio aquí. Por lo tanto, el enlace de Github es confiable. –

+1

Nota, este ejemplo todavía tiene fallas. https://github.com/Udinic/SmallExamples/issues/6 A medida que desplaza la vista de lista hacia arriba y hacia abajo, el estado expandir/colapsar se estropeará. –

+0

@CheokYanCheng ¿Alguna solución para los estados desordenados? Aparentemente, hay un problema cuando nos desplazamos hacia arriba para que la vista se deslice hacia abajo ahora para tener esto. Cambiamos la visibilidad para que el anim. se activa pero hay un parpadeo, la vista se cierra y luego se abre de nuevo para deslizarse hacia abajo :( – beerBear

1

La forma más sencilla es utilizar un ObjectAnimator

ObjectAnimator animation = ObjectAnimator.ofInt(yourTextView, "maxLines", 40); 
animation.setDuration(200).start(); 

Esto cambiará maxLines de su TextView a 40, más de 200 milisegundos.

Tenga cuidado con el uso de suTextView.getLineCount() para determinar a cuántas líneas expandir, porque no dará una cifra exacta hasta después de un pase de diseño. Te recomiendo que solo codifiques un valor de maxLines que sea más largo de lo que esperabas que fuera el texto. También puede estimarlo usando suTextView.length() dividido por el menor número de caracteres que haya esperado por línea.