Показати та приховати перегляд за допомогою анімації зі слайдом вгору / вниз


318

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

Я бачив кілька зразків там, але жоден з них не відповідає моїм потребам.

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

Відповіді:


639

З новим 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
Я хочу оживити перегляд, коли його видно і коли його немає. але якщо я вперше перейшов. Вигляд не здатен, а місце перегляду порожнє
Рам

3
@Ram Чого ти намагаєшся досягти, анімувавши a, Viewколи налаштування його видимості встановлено View.GONE? Якщо ви налаштуєте його видимість на що-небудь крім того, View.VISIBLEто воно Viewне буде видно. Я не розумію, про що ви питаєте. Якщо ви хочете , щоб ваша анімація буде видно , щось не встановити видимість з Viewдо View.GONE.
Xaver Kapeller

2
зіткнувся з тією ж проблемою, з якою зіткнувся Рам, спочатку він працює добре, але з наступного разу, коли я зроблю цей погляд у відсутньому стані і намагаюсь зробити цей погляд знову видимим, він не з’явиться.
Pankaj kumar

12
@XaverKapeller Я думаю , що проблема у багатьох є в тому , що слухач onAnimationEndвикликається кожен раз для декількох зустрічається анімації, а це значить , що onAnimationEndназивається також , коли уявлення отримати показано, який встановлює його видимість Зникла і т.д.
oldergod

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.
  • Документи анімації власності

android: visibility = "невидимий", щоб ініціалізувати перегляд анімації як приховування
Goodlife

2
Я не рекомендую використовувати animate.setFillAfter (вірно); якщо у вас є перегляди, які можна натиснути під слайдом, це не буде
повторювати

2
Зауважте, що без .setVisibility(View.INVISIBLE);функції зсуву вгору не працюватиме так, як візуально очікувалося.
Адвайт 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>

Перевірте цю відповідь за допомогою інших прикладів переходу за замовчуванням та спеціальних переходів.


@akubi Так, так і має бути
Аба

1
Одна з найкращих і легких відповідей! Дякую!
krisDrOid

лише зауважте, для цього потрібноminSdkVersion 21
lasec0203

@ lasec0203 ні, класи - це androidxпакет. Він чудово працює на попередніх 21 квітнях.
ашакіров

: 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>

Докладнішу інформацію про це ви можете знайти в програмі " Анімаційні зміни в макеті" - 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. Thx для цього!
Брам Ванденбусше

1
Оскільки це працює, коли показ, приховуючи, погляд зникає до того, як можна побачити анімацію. Будь-які обходи?
Бернардо

12
@BramVandenbussche Це жахливе рішення. Він Viewнесе відповідальність за свої власні анімації, які НІКОЛИ не бажають. Уявіть, що ви хочете по- Viewіншому анімувати в іншій частині програми. Що ти робиш тоді? Додати прапор, щоб автоматично не анімувати видимість? Підклас Viewі замінити, setVisibility()щоб видалити анімацію? Або ще гірше реалізувати setVisibility()з іншою анімацією? Звідси воно стає просто гірше і потворніше. Не використовуйте це "рішення".
Xaver Kapeller

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


Тільки помилка в тому, що не потрібно «fillAfter = TRUE» , як блокувати думки дитини натисніть доступність
Ranjan

Також вам, ймовірно, потрібно буде додати слухача до анімації slideDown і зробити перегляд поданим на AnimationEnd.
Манохар Редді

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) Ви змінюєте видимість під час виконання анімації. Окрім того, що це очевидний кодовий запах, це також не працюватиме належним чином. Зміна видимості починає новий процес компонування, тільки після цього анімація насправді має значення для роботи. Список продовжується і продовжується ...
Xaver Kapeller

Я вже відредагував вашу відповідь, щоб виправити форматування, і перетворив фрагмент коду у фактичний блок коду. Але вам доведеться заповнити решту ...
Xaver Kapeller

Вибачте, знайомий, я склав код з вашого, тому що він не працює добре для мене, цей код мій працює. Але зміни, необхідні в способі публікації, я згоден.
Ameen Maheen

@AmeenMaheen Для чого потрібен setAlpha?
ІгорГанапольський

@ Ігор Ганапольський використовується для прозорості, тобто для надання ефекту згасання
Ameen Maheen

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, якщо я хочу це зробити жорстким кодом?
Stanley santoso

1
тут 120 і 0 - відстань, пов’язана з віссю Y, якщо ви поставите жорсткий код, ніж виникає проблема на великому екрані або планшеті, тож вам потрібно поставити значення зі значення string.xml для всіх різних пристроїв. і тривалість - це час, коли ви хочете показати анімацію макета .... !!! вибачте за мою бідну англійську ...!
varotariya vajsi

@varotariyavajsi Це насправді не показує / не приховує видимість подання.
ІгорГанапольський

привіт Ігор Ганапольський, я знаю це ... це просто перекласти погляд у напрямку y, якщо користувачеві потрібно буде показувати вгору і вниз, як нижній повзунок, він буде добре працювати.
varotariya vajsi

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

Не потрібно нічого більше робити =)


1
Чому для цього вам потрібен GlobalLayoutListener? Чому ви налаштовуєте видимість на такий дивний спосіб? Чому ви включаєте такі речі, як затримка запуску, що не має значення для сумнівів у своїй відповіді?
Xaver Kapeller

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.