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

318

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

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

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

MichelReap
источник

Ответы:

641

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

Скольжение 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);

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

view.animate()
    .translationY(0)
    .alpha(0.0f)
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            view.setVisibility(View.GONE);
        }
    });
Ксавер Капеллер
источник
1
почему вид не виден после его исчезновения?
Рам
1
Я хочу анимировать вид, когда видим и когда нет. но если я только что ушел, он не виден, а место пусто
Ram
3
@Ram Чего вы пытаетесь достичь, анимируя, Viewкогда его видимость установлена View.GONE? Если вы установите его видимость для чего-либо кроме View.VISIBLEэтого, то Viewон не будет виден. Я не понимаю, что вы спрашиваете. Если вы хотите, чтобы ваша анимация была видимой, не устанавливайте видимость Viewдля View.GONE.
Ксавер Капеллер
2
Столкнувшись с той же проблемой, с которой столкнулся Рам, в первый раз он работает нормально, но со следующего раза, когда я перевожу это представление в ушедшее состояние и пытаюсь снова сделать это представление видимым, оно не появляется.
Панкадж Кумар
12
@XaverKapeller Я думаю, что проблема, с которой многие сталкиваются, заключается в том, что слушатель onAnimationEndкаждый раз вызывается для многократной анимации, что означает, что он onAnimationEndвызывается также, когда представление отображается, который устанавливает его видимость Gone и т. Д.
oldgod
129

У меня были проблемы с пониманием применения принятого ответа. Мне нужно немного больше контекста. Теперь, когда я понял это, вот полный пример:

введите описание изображения здесь

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button myButton;
    View myView;
    boolean isUp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myView = findViewById(R.id.my_view);
        myButton = findViewById(R.id.my_button);

        // initialize as invisible (could also do in xml)
        myView.setVisibility(View.INVISIBLE);
        myButton.setText("Slide up");
        isUp = false;
    }

    // slide the view from below itself to the current position
    public void slideUp(View view){
        view.setVisibility(View.VISIBLE);
        TranslateAnimation animate = new TranslateAnimation(
                0,                 // fromXDelta
                0,                 // toXDelta
                view.getHeight(),  // fromYDelta
                0);                // toYDelta
        animate.setDuration(500);
        animate.setFillAfter(true);
        view.startAnimation(animate);
    }

    // slide the view from its current position to below itself
    public void slideDown(View view){
        TranslateAnimation animate = new TranslateAnimation(
                0,                 // fromXDelta
                0,                 // toXDelta
                0,                 // fromYDelta
                view.getHeight()); // toYDelta
        animate.setDuration(500);
        animate.setFillAfter(true);
        view.startAnimation(animate);
    }

    public void onSlideViewButtonClick(View view) {
        if (isUp) {
            slideDown(myView);
            myButton.setText("Slide up");
        } else {
            slideUp(myView);
            myButton.setText("Slide down");
        }
        isUp = !isUp;
    }
}

activity_mail.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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.slideview.MainActivity">

    <Button
        android:id="@+id/my_button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:onClick="onSlideViewButtonClick"
        android:layout_width="150dp"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:id="@+id/my_view"
        android:background="#a6e1aa"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="200dp">

    </LinearLayout>

</RelativeLayout>

Ноты

  • Спасибо за эту статью, указав мне правильное направление. Это было более полезно, чем другие ответы на этой странице.
  • Если вы хотите начать с просмотра на экране, не инициализируйте его как INVISIBLE.
  • Поскольку мы полностью анимируем его за пределы экрана, нет необходимости устанавливать его обратно INVISIBLE. Если вы не полностью анимируете за пределами экрана, тогда вы можете добавить альфа-анимацию и установить видимость с помощью AnimatorListenerAdapter.
  • Анимация документов
Suragch
источник
android: visibility = "invisible" для инициализации анимации вида как скрытия
Goodlife
2
Я не рекомендую использовать animate.setFillAfter (true); если у вас есть кликабельные виды под слайд-представлением, они не будут
воспринимать
2
Обратите внимание, что без .setVisibility(View.INVISIBLE);функции сдвига вверх не будет работать так, как ожидается.
Advait S
Translate Animationперемещает вид. Если вы хотите , чтобы оживить взгляд , как сам потом использовать его масштабированиеScaleAnimation anim = new ScaleAnimation(1, 1, 0, 1)
Zohab Ali
33

Теперь нужно сделать анимацию изменения видимости, с помощью Transition APIкоторой доступно в пакете поддержки (androidx). Просто вызовите метод TransitionManager.beginDelayedTransition с переходом по слайду, а затем измените видимость представления.

введите описание изображения здесь

import androidx.transition.Slide;
import androidx.transition.Transition;
import androidx.transition.TransitionManager;

private void toggle(boolean show) {
    View redLayout = findViewById(R.id.redLayout);
    ViewGroup parent = findViewById(R.id.parent);

    Transition transition = new Slide(Gravity.BOTTOM);
    transition.setDuration(600);
    transition.addTarget(R.id.redLayout);

    TransitionManager.beginDelayedTransition(parent, transition);
    redLayout.setVisibility(show ? View.VISIBLE : View.GONE);
}

activity_main.xml

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

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="play" />

    <LinearLayout
        android:id="@+id/redLayout"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="#5f00"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

Проверьте этот ответ с помощью других стандартных и пользовательских примеров перехода.

ashakirov
источник
@akubi да, так и должно быть
Аба
1
Один из лучших и простых ответов! Спасибо!
krisDrOid
просто чтобы отметить, это требуетminSdkVersion 21
lasec0203
@ lasec0203 нет, классы из androidxпакета. Он отлично работает на предварительно 21 API.
ашакиров
: thumbs_up: это избавило от ошибки неоднозначности метода, которую я получал
lasec0203
30

Самое простое решение: установить 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

Стефан Медак
источник
Это самый простой, но его поведение отличается из-за производителя телефона, и он меняет код
b2mob
Это оживляет альфу, а не позицию.
Сурагч
Да, но это был первоначальный вопрос, если я правильно понял. Если вы хотите анимировать позиции, вы можете использовать RecyclerView, который использует ViewHolders со стабильными идентификаторами.
Стефан Медак,
12

Вы можете начать корректировать, Animationкогда видимость 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);
    }
}
Ксавер Капеллер
источник
1
На самом деле мне больше нравится подход подкласса. Большое спасибо.
MichelReap
1
Это отличное решение, которое я собираюсь реализовать в своем BaseView. Спасибо за это!
Брэм Ванденбюссе
1
Как это работает при показе, когда скрывается, вид исчезает, прежде чем анимацию можно увидеть. Есть обходные пути?
Бернардо
12
@BramVandenbussche Это ужасное решение. Это делает Viewответственность за свои собственные анимации, что НИКОГДА не то, что вы хотите. Представьте, что вы хотите анимировать по- Viewдругому в другой части вашего приложения. Что вы делаете тогда? Добавить флаг, чтобы не автоматически анимировать видимость? Подкласс Viewи переопределить, setVisibility()чтобы удалить анимацию? Или еще хуже реализовать setVisibility()с другой анимацией? Это становится все хуже и хуже оттуда. Не используйте это «решение».
Ксавер Капеллер
3
Лучше назовите это AnimatedLinearLayout
Roel
12

Котлин

На основе Suragch «s ответ , здесь это элегантный способ использования View расширения:

fun View.slideUp(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, this.height.toFloat(), 0f)
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun View.slideDown(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, 0f, this.height.toFloat())
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

И тогда, где бы вы ни хотели его использовать, вам просто нужно myView.slideUp()илиmyView.slideDown()

Đorđe Nilović
источник
Единственная ошибка, она не нуждается в "fillAfter = true", так как она блокирует дочерние представления, щелкнув доступность
Ranjan
Также вам, вероятно, потребуется добавить слушателя к анимации slideDown и сделать так, чтобы представление пропало на анимации.
Манохар Редди
9
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);
                }
            });
}
Амин Махин
источник
10
Проблемы с этим ответом: 1) Ужасное форматирование кода. 2) Вы используете фрагмент кода для публикации кода, который на самом деле не может быть запущен в браузере. Это не только добавляет две бесполезные кнопки, но и уничтожает подсветку синтаксиса. 3) Это просто случайный дамп кода без каких-либо объяснений или целей. 4) Вы меняете видимость во время анимации. Помимо того факта, что это очевидный запах кода, это также не будет работать должным образом. Изменение видимости запускает новый процесс верстки, только после того, как это закончено, у анимации действительно есть значения для работы. Список можно продолжать и продолжать ...
Ксавер Капеллер
Я уже отредактировал ваш ответ, чтобы исправить форматирование, и превратил фрагмент кода в реальный блок кода. Но вы должны заполнить все остальное ...
Ксавер Капеллер
Извините, приятель, я составил код от вашего, потому что он не работает для меня, этот код работает. Но изменения, необходимые для публикации, я согласен.
Амин Махин
@ AmeenMaheen Для чего setAlpha?
Игорь Ганапольский
@ Игорь Ганапольский, он используется для прозрачности, то есть, чтобы дать эффект выцветания
Амин Махин
4

Вы можете скользить вверх и вниз любого вида или макета, используя приведенный ниже код в приложении для 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));
                }
варотария вайси
источник
что такое 120? а что такое 0? какой блок для setDuration, если я хочу жестко закодировать это?
Стэнли Сантозо
1
здесь 120 и 0 - это расстояние, относящееся к оси Y, если вы поставили жесткий код, а не проблему на большом экране или планшете, поэтому вам нужно указать значение из вашего string.xml для всех различных устройств. и продолжительность это время, когда вы хотите показать анимацию макета .... !!! извините за мой плохой английский ...!
варотария вайси
@varotariyavajsi Это фактически не показывает / скрывает видимость представления.
Игорь Ганапольский
привет игорь ганапольский, я знаю это ... это просто перевод вида в направлении y, если пользователю нужно показывать вверх и вниз, как нижний слайдер, он будет работать нормально.
варотария вайси
4

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

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;
}
}
Амин
источник
3

Использование ObjectAnimator

private fun slideDown(view: View) {
    val height = view.height
    ObjectAnimator.ofFloat(view, "translationY", 0.toFloat(), height.toFloat()).apply {
        duration = 1000
        start()
    }
}

private fun slideUp(view: View) {
    val height = view.height
    ObjectAnimator.ofFloat(view, "translationY", height.toFloat(),0.toFloat()).apply {
        duration = 1000
        start()
    }
}
Вихан Верма
источник
2
Незначительные улучшения: мы можем использовать константу View.TRANSLATION_Y вместо «translationY», а также в слайде вверх ObjectAnimation мы можем сделать .apply {doOnEnd {view.visibility = View.GONE} .......}. Start ()
Таши
0.toFloat()тоже можно просто0f
styler1972
2

У меня был угловой случай, когда высота моего взгляда была еще 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);
                    }
                });
    }

}
Самуил
источник
1

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

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();
        }
    });
}

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

Tiago
источник
1
Зачем вам нужен GlobalLayoutListener для этого? Почему вы устанавливаете видимость таким странным образом? Почему вы включаете такие вещи, как задержка запуска, которая не имеет отношения к вопросу в вашем ответе?
Ксавер Капеллер
1

Ответ Сурагча в Котлин. Это сработало для меня.

class MainActivity : AppCompatActivity() {

var isUp: Boolean = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var myView: View = findViewById(R.id.my_view)
    var myButton: Button = findViewById(R.id.my_button)

    //Initialize as invisible
    myView.visibility = View.INVISIBLE
    myButton.setText("Slide up")

    isUp = false

}


fun View.slideUp(duration: Int = 500){
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, this.height.toFloat(), 0f)
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun View.slideDown(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, 0f, this.height.toFloat())
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun onSlideViewButtonClick(view: View){
    if(isUp){
        my_view.slideDown()
        my_button.setText("Slide Up")

    }
    else{
        my_view.slideUp()
        my_button.setText("Slide Down")
    }
    isUp = !isUp
}

}

олле
источник
0

Вы можете использовать простые три строки кода, чтобы показать анимацию ...

//getting the hiding view by animation

 mbinding.butn.setOnClickListener {

                val SlideOutLeft = AnimationUtils.loadAnimation(this, R.anim.slide_out_left)
                simplelayout.visibility = View.INVISIBLE
                simplelayout.startAnimation(SlideOutLeft)


                val SlideInRight = AnimationUtils.loadAnimation(applicationContext, R.anim.slide_in_right)
                animation1.visibility = View.VISIBLE
                animation1.startAnimation(SlideInRight)

            }
            //again unhide the view animation
            mbinding.buttn.setOnClickListener {


               val SlideInLeft=AnimationUtils.loadAnimation(this,R.anim.slide_in_left)
                //set the layout
               simplelayout.visibility=View.VISIBLE
               simplelayout.startAnimation(SlideInLeft)

               val SlideOutRight=AnimationUtils.loadAnimation(this,R.anim.slide_out_right)
               animation1.visibility=View.INVISIBLE
               animation1.startAnimation(SlideOutRight)

            }
Йогеш Сингх Патания
источник
0

С расширениями Kotlin вы можете использовать это:

enum class SlideDirection{
    UP,
    DOWN,
    LEFT,
    RIGHT
}

enum class SlideType{
    SHOW,
    HIDE
}

fun View.slideAnimation(direction: SlideDirection, type: SlideType, duration: Long = 250){
    val fromX: Float
    val toX: Float
    val fromY: Float
    val toY: Float
    val array = IntArray(2)
    getLocationInWindow(array)
    if((type == SlideType.HIDE && (direction == SlideDirection.RIGHT || direction == SlideDirection.DOWN)) ||
        (type == SlideType.SHOW && (direction == SlideDirection.LEFT || direction == SlideDirection.UP))   ){
        val displayMetrics = DisplayMetrics()
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        val deviceWidth = displayMetrics.widthPixels
        val deviceHeight = displayMetrics.heightPixels
        array[0] = deviceWidth
        array[1] = deviceHeight
    }
    when (direction) {
        SlideDirection.UP -> {
            fromX = 0f
            toX = 0f
            fromY = if(type == SlideType.HIDE) 0f else (array[1] + height).toFloat()
            toY = if(type == SlideType.HIDE) -1f * (array[1] + height)  else 0f
        }
        SlideDirection.DOWN -> {
            fromX = 0f
            toX = 0f
            fromY = if(type == SlideType.HIDE) 0f else -1f * (array[1] + height)
            toY = if(type == SlideType.HIDE) 1f * (array[1] + height)  else 0f
        }
        SlideDirection.LEFT -> {
            fromX = if(type == SlideType.HIDE) 0f else 1f * (array[0] + width)
            toX = if(type == SlideType.HIDE) -1f * (array[0] + width) else 0f
            fromY = 0f
            toY = 0f
        }
        SlideDirection.RIGHT -> {
            fromX = if(type == SlideType.HIDE) 0f else -1f * (array[0] + width)
            toX = if(type == SlideType.HIDE) 1f * (array[0] + width) else 0f
            fromY = 0f
            toY = 0f
        }
    }
    val animate = TranslateAnimation(
        fromX,
        toX,
        fromY,
        toY
    )
    animate.duration = duration
    animate.setAnimationListener(object: Animation.AnimationListener{
        override fun onAnimationRepeat(animation: Animation?) {

        }

        override fun onAnimationEnd(animation: Animation?) {
            if(type == SlideType.HIDE){
                visibility = View.INVISIBLE
            }
        }

        override fun onAnimationStart(animation: Animation?) {
            visibility = View.VISIBLE
        }

    })
    startAnimation(animate)
}

Пример для расширения:

view.slideAnimation(SlideDirection.UP, SlideType.HIDE)//to make it disappear through top of the screen
view.slideAnimation(SlideDirection.DOWN, SlideType.SHOW)//to make it reappear from top of the screen

view.slideAnimation(SlideDirection.DOWN, SlideType.HIDE)//to make it disappear through bottom of the screen
view.slideAnimation(SlideDirection.UP, SlideType.SHOW)//to make it reappear from bottom of the screen
Мерткан Шучен
источник
0

Один из простых способов:

containerView.setLayoutTransition(LayoutTransition())
containerView.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
hallz12
источник