Показать и скрыть представление с помощью анимации слайдов вверх / вниз

У меня есть LinearLayout который я хочу показать или скрыть с помощью Animation которая подталкивает макет вверх или вниз, когда я изменяю его видимость.

Я видел несколько образцов, но ни один из них не отвечал моим потребностям.

Я создал два xml-файла для анимации, но я не знаю, как их запустить, когда я изменяю видимость LinearLayout .

Solutions Collecting From Web of "Показать и скрыть представление с помощью анимации слайдов вверх / вниз"

С новым API анимации, который был представлен в Android 3.0 (Honeycomb), очень просто создать такие анимации.

Скользящий a View вниз на расстояние:

 view.animate().translationY(distance); 

Вы можете позже переместить View в исходное положение следующим образом:

 view.animate().translationY(0); 

Вы также можете легко комбинировать несколько анимаций. Следующая анимация сдвинет View вниз вниз по его высоте и затухает в одно и то же время:

 // Prepare the View for the animation view.setVisibility(View.VISIBLE); view.setAlpha(0.0f); // Start the animation view.animate() .translationY(view.getHeight()) .alpha(1.0f) .setListener(null); 

Затем вы можете убрать изображение назад и переместить его обратно в исходное положение. Мы также устанавливаем AnimatorListener чтобы мы могли установить видимость представления обратно в GONE после завершения анимации:

 view.animate() .translationY(0) .alpha(0.0f) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); view.setVisibility(View.GONE); } }); 

Вы можете начать правильную Animation когда LinearLayout видимость LinearLayout , создав новый подкласс LinearLayout и переопределив setVisibility() чтобы запустить Animations . Рассмотрим что-то вроде этого:

 public class SimpleViewAnimator extends LinearLayout { private Animation inAnimation; private Animation outAnimation; public SimpleViewAnimator(Context context) { super(context); } public void setInAnimation(Animation inAnimation) { this.inAnimation = inAnimation; } public void setOutAnimation(Animation outAnimation) { this.outAnimation = outAnimation; } @Override public void setVisibility(int visibility) { if (getVisibility() != visibility) { if (visibility == VISIBLE) { if (inAnimation != null) startAnimation(inAnimation); } else if ((visibility == INVISIBLE) || (visibility == GONE)) { if (outAnimation != null) startAnimation(outAnimation); } } super.setVisibility(visibility); } } 
 if (filter_section.getVisibility() == View.GONE) { filter_section.animate() .translationY(filter_section.getHeight()).alpha(1.0f) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); filter_section.setVisibility(View.VISIBLE); filter_section.setAlpha(0.0f); } }); } else { filter_section.animate() .translationY(0).alpha(0.0f) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); filter_section.setVisibility(View.GONE); } }); } 

android:animateLayoutChanges="true" решение: установите android:animateLayoutChanges="true" на контейнере с вашими взглядами.

Чтобы включить его в какой-то контекст: если у вас есть макет, как показано ниже, все изменения видимости в представлениях в этом контейнере будут анимированы автоматически.

 <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" > <Views_which_change_visibility> </LinearLayout> 

Вы можете найти более подробную информацию об этом в Animating Layout Changes – Android Developer

Вы можете перемещать вверх и вниз любой вид или макет, используя следующий код в приложении для Android

 boolean isClicked=false; LinearLayout mLayoutTab = (LinearLayout)findViewById(R.id.linearlayout); if(isClicked){ isClicked = false; mLayoutTab.animate() .translationYBy(120) .translationY(0) .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime)); }else{ isClicked = true; mLayoutTab.animate() .translationYBy(0) .translationY(120) .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime)); } 

Вот мое решение. Просто получите ссылку на ваш взгляд и вызовите этот метод:

 public static void animateViewFromBottomToTop(final View view){ view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); final int TRANSLATION_Y = view.getHeight(); view.setTranslationY(TRANSLATION_Y); view.setVisibility(View.GONE); view.animate() .translationYBy(-TRANSLATION_Y) .setDuration(500) .setStartDelay(200) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(final Animator animation) { view.setVisibility(View.VISIBLE); } }) .start(); } }); } 

Не нужно ничего делать =)

Используйте этот класс:

 public class ExpandCollapseExtention { public static void expand(View view) { view.setVisibility(View.VISIBLE); final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(widthSpec, heightSpec); ValueAnimator mAnimator = slideAnimator(view, 0, view.getMeasuredHeight()); mAnimator.start(); } public static void collapse(final View view) { int finalHeight = view.getHeight(); ValueAnimator mAnimator = slideAnimator(view, finalHeight, 0); mAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationEnd(Animator animator) { view.setVisibility(View.GONE); } @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); mAnimator.start(); } private static ValueAnimator slideAnimator(final View v, int start, int end) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int value = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); layoutParams.height = value; v.setLayoutParams(layoutParams); } }); return animator; } } 

У меня был угловой футляр, в котором высота моего представления была zero поэтому …

 import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.view.View; public final class AnimationUtils { public static void slideDown(final View view) { view.animate() .translationY(view.getHeight()) .alpha(0.f) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { // superfluous restoration view.setVisibility(View.GONE); view.setAlpha(1.f); view.setTranslationY(0.f); } }); } public static void slideUp(final View view) { view.setVisibility(View.VISIBLE); view.setAlpha(0.f); if (view.getHeight() > 0) { slideUpNow(view); } else { // wait till height is measured view.post(new Runnable() { @Override public void run() { slideUpNow(view); } }); } } private static void slideUpNow(final View view) { view.setTranslationY(view.getHeight()); view.animate() .translationY(0) .alpha(1.f) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { view.setVisibility(View.VISIBLE); view.setAlpha(1.f); } }); } }