Ver animaciones en Android Colapsar / Expandir vistas en LinearLayout

Añadí imágenes de forma dinámica a mi diseño lineal,

Quiero lograr

Introduzca aquí la descripción de la imagen

Aquí está el código de ejemplo lo que he hecho

Actividad principal

package ksp.com.animationssample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity { private Button btn_expand; private Button btn_collapse; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_expand = (Button) findViewById(R.id.btn_expand); btn_collapse = (Button) findViewById(R.id.btn_collapse); LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); final LinearLayout layout = (LinearLayout) findViewById(R.id.imageLayout); for (int i = 0; i < 3; i++) { final ImageView image = new ImageView(MainActivity.this); image.setLayoutParams(vp); if (i == 0) image.setImageDrawable(getResources().getDrawable(R.drawable.item_image1)); else image.setImageDrawable(getResources().getDrawable(R.drawable.item_image2)); if (i == 2) image.setVisibility(View.VISIBLE); else image.setVisibility(View.GONE); layout.addView(image); } btn_expand.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { expandOrCollapse(layout.getChildAt(2), true, layout.getChildAt(0).getHeight() + layout.getChildAt(1).getHeight()); expandOrCollapse(layout.getChildAt(1), true, layout.getChildAt(0).getHeight()); expandOrCollapse(layout.getChildAt(0), true, 0); } }); btn_collapse.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { expandOrCollapse(layout.getChildAt(0), false, 0); expandOrCollapse(layout.getChildAt(1), false, layout.getChildAt(0).getHeight()); expandOrCollapse(layout.getChildAt(2), false, layout.getChildAt(0).getHeight() + layout.getChildAt(1).getHeight()); } }); } public void expandOrCollapse(final View v, boolean is_expand, final int animheight) { TranslateAnimation anim = null; if (is_expand) { anim = new TranslateAnimation(0.0f, 0.0f, -animheight, 0.0f); v.setVisibility(View.VISIBLE); Animation.AnimationListener expandedlistener = new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { } }; anim.setAnimationListener(expandedlistener); } else { anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, -animheight); Animation.AnimationListener collapselistener = new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { v.setVisibility(View.GONE); } }; anim.setAnimationListener(collapselistener); } anim.setDuration(1500); anim.setInterpolator(new AccelerateInterpolator(0.5f)); v.startAnimation(anim); } } 

Activity_mainn.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" android:background="@android:color/holo_blue_dark" tools:context="ksp.com.animationssample.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:id="@+id/btn_expand" android:text="Expand" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_collapse" android:text="Collopse"/> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical"> <LinearLayout android:layout_width="match_parent" android:id="@+id/imageLayout" android:gravity="center" android:orientation="vertical" android:layout_height="wrap_content"> </LinearLayout> <!--android:animateLayoutChanges="true"--> </ScrollView> </RelativeLayout> 

Cuando hago clic en Expandir botón en la primera vez no se muestra la animación de la segunda vez que está funcionando.

Habilitar Visible el elemento después de hacer clic en el botón de contracción .

Qué hacer a continuación : Cuando he seleccionado cualquier elemento de vista que tiene que mostrar la animación de selección, a continuación, colapso de la animación, después de colapso que tiene que aparecer como vista superior como menciono en la imagen anterior. Actualmente soy código duro la cuenta de las vistas y escribí animaciones estáticas para cada vista con alturas estáticas de animaciones ie ( expandOrCollapse(view, height_of_view) )

Busco un rato para esto, pero no hay suerte.

Sigo la expansión / colapso de Expand y suavizar / expandir, pero no pueden ayudarme a expandir todas las vistas en el diseño Lineal.

¿Podemos hacer esto Las vistas de la lista son la opinión del reciclador o algo?

Para el ahorro de tiempo He añadido mi muestra a git hub puedes probarlo Animation Sample Github

Sugíeme, por favor.

He hecho una clase separada para ella. Compruebe si funciona para usted:

 public class DropDownAnim extends Animation { private final int targetHeight; private final View view; private final 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 = targetHeight - (int) (targetHeight * interpolatedTime);//(int) (targetHeight * (1 - interpolatedTime)); } view.getLayoutParams().height = newHeight; view.requestLayout(); view.setVisibility(down ? View.VISIBLE : View.GONE); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); } @Override public boolean willChangeBounds() { return true; } } 

Mientras trabajaba con esto. Para expandir

 public void expand(final View v) { final int targetHeight = getResources().getDimensionPixelSize(R.dimen.notification_height);//v.getMeasuredHeight(); DropDownAnim a = new DropDownAnim(v,targetHeight,true); a.setDuration((int) (targetHeight / v.getContext().getResources().getDisplayMetrics().density)); a.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { // Your code on end of animation } @Override public void onAnimationRepeat(Animation animation) { } }); v.setVisibility(View.INVISIBLE); v.startAnimation(a); } 

Para el colapso:

 public void collapse(final View v) { final int targetHeight = v.getMeasuredHeight(); DropDownAnim a = new DropDownAnim(v, targetHeight, false); a.setDuration((int) (targetHeight / v.getContext().getResources().getDisplayMetrics().density)); a.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { // Your code on end of animation } @Override public void onAnimationRepeat(Animation animation) { } }); v.startAnimation(a); } 

Trate de no ocultar la vista de destino (ahora se establece la visibilidad GONE para todas las vistas después del final de la animación colapsada) y haga lo siguiente:

 targetView.bringToFront(); targetView.invalidate(); targetView.getParent().requestLayout(); 
  • Android Horizontal LinearLayout - Envolver elementos
  • ¿Cómo puedo alinear mi ImageView con mi TextView en LinearLayout?
  • compruebe si existe una vista desde un inflador de diseño antes de añadir otro
  • Eliminar espacio entre los botones de LinearLayout (Android)
  • Android Linear / Disposición relativa - cómo "tamaño automático" objeto en el centro (3 objetos)
  • Establecer gravedad para LinearLayout mediante programación
  • ¿Cómo igualmente span botones / diseños verticalmente en android?
  • Establecer un ancho máximo en un grupo de vistas
  • Diseño lineal y peso en Android
  • Android: inversión de peso extraño en LinearLayout
  • Programe el ancho del botón de forma programada en 50% de los padres LinearLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.