Конец события анимации android

У меня есть анимация затухания в представлении (которое находится внутри фрагмента), и каждый раз, когда происходит анимация, после ее завершения представление снова перерисовывается. Я нашел способ сделать view.SetVisibility(View.GONE) . Но он не ждет окончания анимации. Я хотел бы выполнить этот код setVisibility только после завершения анимации. Как лучше всего это сделать?


person Paulo Barros    schedule 30.09.2011    source источник
comment
Опубликуйте свой код, как вы показываете анимацию....   -  person Lalit Poptani    schedule 30.09.2011


Ответы (5)


Вы можете добавить прослушиватель анимации к вашему объекту анимации, например

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
person blessenm    schedule 30.09.2011
comment
Если вы хотите предотвратить повторный запуск анимации затухания во время ее выполнения, используйте if (!anim.hasStarted() || anim.hasEnded()), чтобы определить, выполняется ли анимация. - person theczechsensation; 28.12.2014

Функционально то же, что и принятый ответ, но гораздо более лаконично:

// Add/Remove any animation parameter
theView.animate()
        .alpha(0)
        .setDuration(2000)
        .withEndAction(new Runnable() {
            @Override
            public void run() {
                theView.setVisibility(View.GONE);
            }
        });

Наслаждаться :)

person Antzi    schedule 29.09.2016
comment
Четко и однострочно. Топ ответ! Можно упростить с помощью лямбда .withEndAction(() -> theView.setVisibility(View.GONE)); - person theBugger; 04.10.2016
comment
Имейте в виду, что это уровень API 16 (4.1) и выше. - person Tommie; 28.12.2016
comment
Удивительное решение, мой друг. Спасибо! - person Vlad Ivchenko; 17.03.2018
comment
Важная информация: действие выполняется только в том случае, если анимация завершается нормально, если ViewPropertyAnimator отменяется во время этой анимации, исполняемый объект не запускается. - person Sarthak_ssg5; 07.06.2019
comment
Работает как шарм, в том числе при использовании компонента навигации в runnable. (Прослушиватель анимации всегда аварийно завершал работу, когда я перемещался с помощью компонента навигации.) - person Luigi_Papardelle; 21.01.2020
comment
Это ответ, который я искал некоторое время! - person coolcool1994; 04.08.2020

Вы также можете добиться этого, используя Animation.setFillAfter

person Pavan    schedule 30.09.2011

Просто возьмите объект анимации и добавьте к нему прослушиватель анимации. Вот пример кода:

rotateAnimation.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // TODO Auto-generated method stub

**// WRITE HERE WHATEVER YOU WANT ON THE COMPLETION OF THE ANIMATION**


            }
        });
person Gaurav Arora    schedule 03.06.2013

Пример для Котлина

var fadeOutImage = findViewById<ImageView>(R.id.fade_out_Image)
    val fadeOutAnimation = R.anim.fade_out_animation
    val animation = AnimationUtils.loadAnimation(this, fadeOutAnimation)
    fadeOutImage.startAnimation(animation)

    animation.setAnimationListener(object : Animation.AnimationListener {
        override fun onAnimationStart(p0: Animation?) {
//                not implemented
        }

        override fun onAnimationRepeat(p0: Animation?) {
//                not implemented
        }

        override fun onAnimationEnd(p0: Animation?) {
            fadeOutImage.visibility = View.INVISIBLE
        }
    })
person richc    schedule 27.03.2018
comment
вы можете сохранить некоторые строки, используя fade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start() - person longi; 18.07.2019