2016-11-24 7 views
3

Я пробовал различные решения из этой темы (см. Android: Expand/collapse animation), и никто из них не работал для меня. Я уверен, что большинство проголосовавших хороши, и причина, по которой это не сработает, заключается в том, что я ничего не понимаю. Пожалуйста, скажите мне, что я делаю неправильно. Заранее спасибо :)Android expand/collapse RelativeLayout

EDIT: Суть моей проблемы в том, что, когда я нажимаю на элемент «» relativeZaplon он расширяется очень хорошо, но когда я хочу, чтобы свернуть его, он не соответствует.

MainActivity

public class MainActivity extends AppCompatActivity { 

    private boolean isVisible = false; 
    private RelativeLayout mRelativeZaplon; 
    private RelativeLayout mRelativeToSlide; 
    private ExpandOrCollapse mAnimationManager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mAnimationManager = new ExpandOrCollapse(); 
     mRelativeZaplon = (RelativeLayout) findViewById(R.id.relativeZaplon); 
     mRelativeToSlide = (RelativeLayout) findViewById(R.id.relativevToSlide); 
     mRelativeZaplon.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (isVisible) { 
        mAnimationManager.collapse(mRelativeToSlide, 1000, 200); 
        isVisible = false; 
       } else if (!isVisible){ 
        mAnimationManager.expand(mRelativeToSlide, 1000, 200); 
        isVisible = true; 
       } 
      } 
     }); 
    } 
} 

Развернуть/свернуть Класс

public class ExpandOrCollapse { 

    public static void expand(final View v, int duration, int targetHeight) { 
     int prevHeight = v.getHeight(); 
     v.setVisibility(View.VISIBLE); 
     ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight); 
     valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator animation) { 
       v.getLayoutParams().height = (int) animation.getAnimatedValue(); 
       v.requestLayout(); 
      } 
     }); 
     valueAnimator.setInterpolator(new DecelerateInterpolator()); 
     valueAnimator.setDuration(duration); 
     valueAnimator.start(); 
    } 

    public static void collapse(final View v, int duration, int targetHeight) { 
     int prevHeight = v.getHeight(); 
     ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight); 
     valueAnimator.setInterpolator(new DecelerateInterpolator()); 
     valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator animation) { 
       v.getLayoutParams().height = (int) animation.getAnimatedValue(); 
       v.requestLayout(); 
      } 
     }); 
     valueAnimator.setInterpolator(new DecelerateInterpolator()); 
     valueAnimator.setDuration(duration); 
     valueAnimator.start(); 
    } 
} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:background="@color/colorPrimaryDark" 
     android:id="@+id/relativevToSlide" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:visibility="gone"> 
    </RelativeLayout> 
    <RelativeLayout 
     android:id="@+id/relativeZaplon" 
     android:background="@color/colorAccent" 
     android:layout_width="match_parent" 
     android:layout_height="20dp" 
     android:layout_below="@+id/relativevToSlide" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true"> 
    </RelativeLayout> 
</LinearLayout> 
+0

вы могли бы быть более конкретными о том, что не работает? Вы получаете сообщение об ошибке? –

+0

@AHoneyBustard привет, да, извините. Я уже редактировал сообщение :) cheers. –

ответ

1

Это происходит потому, что

  if (isVisible) { 
       mAnimationManager.collapse(mRelativeToSlide, 1000, 200); 
       isVisible = false; 
      } else if (!isVisible){ 
       mAnimationManager.expand(mRelativeToSlide, 1000, 200); 
       isVisible = true; 
      } 

collapse() и expand() делают то же самое, они оба расширяют анимацию в этом случае. Вам нужно передать другое значение вашему методу collapse(); Метод Простое решение

mAnimationManager.collapse(mRelativeToSlide, 1000, -200); 

Но есть еще некоторые проблемы с вашим стилем кодирования, например, вы могли бы просто избавиться от коллапса(), потому что вызов расширить в два раза, как это будет работать:

  if (isVisible) { 
       mAnimationManager.expand(mRelativeToSlide, 1000, -200); 
       isVisible = false; 
      } else if (!isVisible){ 
       mAnimationManager.expand(mRelativeToSlide, 1000, 200); 
       isVisible = true; 
      } 

Предлагаю вам разместить его на Code Review.

+0

Большое спасибо. Я чувствую себя манекеном, которого я не видел. Это решение разрешило проблему. –

3

Это моя версия метода, вам не нужно устанавливать высоту, она будет расширять или сворачивать любое представление в зависимости от его видимости.

public static void expand(final View v, int duration) { 
    final boolean expand = v.getVisibility()!=View.VISIBLE; 

    int prevHeight = v.getHeight(); 
    int height = 0; 
    if (expand) { 
     int measureSpecParams = View.MeasureSpec.getSize(View.MeasureSpec.UNSPECIFIED); 
     v.measure(measureSpecParams, measureSpecParams); 
     height = v.getMeasuredHeight(); 
    } 

    ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, height); 
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      v.getLayoutParams().height = (int) animation.getAnimatedValue(); 
      v.requestLayout(); 
     } 
    }); 

    valueAnimator.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationStart(Animator animation) { 
      if (expand){ 
       v.setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      if (!expand){ 
       v.setVisibility(View.INVISIBLE); 
      } 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 

     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 

     } 
    }); 
    valueAnimator.setInterpolator(new DecelerateInterpolator()); 
    valueAnimator.setDuration(duration); 
    valueAnimator.start(); 
} 

Просто вызовите метод следующим образом:

expand(YOURVIEWID,500); 
+0

Его произведение очарование. вы меняете время – Ninja

Смежные вопросы