Las vistas de Android amplían la animación

Estoy tratando de editar estas fuentes para crear una función simple que funcionará en todas mis vistas.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); RelativeLayout mLayout1 = (RelativeLayout) findViewById(R.id.layout1); RelativeLayout mLayoutToBeExpanded1 = (RelativeLayout) findViewById(R.id.layout_exp_1); addAction(mLayout, mLayoutToBeExpanded); RelativeLayout mLayout2 = (RelativeLayout) findViewById(R.id.layout2); RelativeLayout mLayoutToBeExpanded2 = (RelativeLayout) findViewById(R.id.layout_exp_2); addAction(mLayout2, mLayoutToBeExpanded2); RelativeLayout mLayout3 = (RelativeLayout) findViewById(R.id.layout3); RelativeLayout mLayoutToBeExpanded3 = (RelativeLayout) findViewById(R.id.layout_exp_3); addAction(mLayout3, mLayoutToBeExpanded3); } public void addAction(final View layout, final View summary) { summary.getViewTreeObserver().addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { summary.getViewTreeObserver().removeOnPreDrawListener(this); summary.setVisibility(View.GONE); final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); summary.measure(widthSpec, heightSpec); mAnimator = slideAnimator(0, summary.getMeasuredHeight(), summary); return true; } }); layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (summary.getVisibility() == View.GONE) { expand(summary); } else { collapse(summary); } } }); } private void expand(View summary) { //set Visible summary.setVisibility(View.VISIBLE); /* Remove and used in preDrawListener final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); mLinearLayout.measure(widthSpec, heightSpec); mAnimator = slideAnimator(0, mLinearLayout.getMeasuredHeight()); */ mAnimator.start(); } private void collapse(final View summary) { int finalHeight = summary.getHeight(); ValueAnimator mAnimator = slideAnimator(finalHeight, 0, summary); mAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationEnd(Animator animator) { //Height=0, but it set visibility to GONE summary.setVisibility(View.GONE); } @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); mAnimator.start(); } private ValueAnimator slideAnimator(int start, int end, final View summary) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { //Update Height int value = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = summary.getLayoutParams(); layoutParams.height = value; summary.setLayoutParams(layoutParams); } }); return animator; } 

El problema: los dos primeros diseños funcionan sólo una vez. Después de la primera expansión -> colapso la onClickFunction no está funcionando. La disposición 3 está trabajando muy bien, puedo ampliar / contraerla varias veces. ¿Alguna solución?

He resuelto por mí mismo, así que, aquí es la solución de trabajo para un diseño ampliable.

Utilizar:

 addAction(YourLayout, LayoutToBeExpanded) 

Función:

  public void addAction(final View layout, final View summary) { layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (summary.getVisibility() == View.GONE) { expand(summary); } else { collapse(summary); } } }); } private void expand(View summary) { //set Visible summary.setVisibility(View.VISIBLE); final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); summary.measure(widthSpec, 300); mAnimator = slideAnimator(0, 300, summary); mAnimator.start(); } private void collapse(final View summary) { int finalHeight = summary.getHeight(); ValueAnimator mAnimator = slideAnimator(finalHeight, 0, summary); mAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationEnd(Animator animator) { //Height=0, but it set visibility to GONE summary.setVisibility(View.GONE); } @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); mAnimator.start(); } private ValueAnimator slideAnimator(int start, int end, final View summary) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { //Update Height int value = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = summary.getLayoutParams(); layoutParams.height = value; summary.setLayoutParams(layoutParams); } }); return animator; } 

Si también desea colapsar el "mLayoutToBeExpanded" en el auto-clic, use esto:

  public void addAction(final View layout, final View summary) { layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (summary.getVisibility() == View.GONE) { expand(summary); } else { collapse(summary); } } }); summary.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (summary.getVisibility() == View.VISIBLE) { collapse(summary); } else { //nothing } } }); } 

Utilice este método para lograr el colapso y Expanda la animación:

  public void expandOrCollapse(final View v,String exp_or_colpse) { TranslateAnimation anim = null; if(exp_or_colpse.equals("expand")) { anim = new TranslateAnimation(0.0f, 0.0f, -v.getHeight(), 0.0f); v.setVisibility(View.VISIBLE); } else{ anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, -v.getHeight()); AnimationListener collapselistener= new 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); } // To Collapse // anim.setDuration(300); anim.setInterpolator(new AccelerateInterpolator(0.5f)); v.startAnimation(anim); } 

Y Llame a este método en su código:

  //For Expand View expandOrCollapse(YourView,"expand"); //For Collapse View expandOrCollapse(yourView,"collapse"); 
  ValueAnimator expandAnimation = ValueAnimator.ofInt(mainView.getHeight(), 400); expandAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(final ValueAnimator animation) { int height = (Integer) animation.getAnimatedValue(); RelativeLayout.LayoutParams lp = (LayoutParams) mainView.getLayoutParams(); lp.height = height; } }); expandAnimation.setDuration(500); expandAnimation.start(); 

Sólo una alternativa, fácil de usar. Para ampliar la vista con animación:

 view.setPivotY(0); ObjectAnimator.ofFloat(view, "scaleY", 0f, 1f).setDuration(300).start(); 
  • Interceptación de clics desde subview en Android
  • Toast dentro del método onClick en Fragment
  • Android ListView con elementos que se pueden hacer clic en sus filas provoca problemas de desplazamiento continuo
  • Botón setonclicklistener error
  • Array @OnClick con identificadores opcionales (ButterKnife)
  • Evitar que DialogFragment se rechace cuando se hace clic en el botón
  • Deshabilitar onMarkerClickListener completamente en Google Maps API v2
  • ¿Cómo abrir el menú deslizante en el evento de clic del botón?
  • Cómo hacer clic o tocar en un texto de TextView
  • OnClick posición en cadena en TextView
  • efecto de clic de cuadrícula
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.