Ver animaciones en Android Colapsar / Expandir vistas en LinearLayout
Añadí imágenes de forma dinámica a mi diseño lineal,
Quiero lograr
- ¿Podemos usar un ScrollView dentro de un LinearLayout?
- Agregar LinearLayout por programación en Android no funciona
- Tener un problema al eliminar TextViews de un LinearLayout mediante programación
- Pasando la referencia layout_weight desde las dimensiones (dimens)
- ¿Cómo agregar un fragmento a un diseño generado mediante programa?
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.
- Hacer vistas de la misma altura en LinearLayout cuando todas son wrap_content
- Desplazamiento de una Galería con botones
- Agregar un elemento CheckBox a ListView impide que pueda recibir ItemClick
- Altura y peso de la disposición lineal
- La barra de herramientas de Android se mueve hacia arriba cuando aparece el teclado
- ¿Cuál es la forma más rápida de agregar varias vistas a un LinearLayout?
- ¿Cómo centrar un GridView en su matriz LinearLayout?
- Android que el diseño a utilizar para desbordar objetos a la siguiente línea
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();