Завершить событие анимации android


90

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


Разместите свой код, как вы показываете анимацию ....
Лалит Поптани

Ответы:


175

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

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});

5
Если вы хотите предотвратить повторный запуск анимации затухания во время ее выполнения, используйте, if (!anim.hasStarted() || anim.hasEnded())чтобы определить, выполняется ли еще анимация.
theczechsensation

39

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

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

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


3
Ясный и однострочный. Лучший ответ! Можно просто проверить с помощью лямбды.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger

2
Имейте в виду, что это API уровня 16 (4.1) и выше.
Tommie

Замечательное решение, друг мой. Спасибо!
Влад Ивченко

Важная информация: - Действие запускается только в том случае, если анимация заканчивается нормально, если ViewPropertyAnimator отменяется во время этой анимации, runnable не запускается.
Sarthak_ssg5 07

1
Работает как шарм, даже при использовании компонента навигации в исполняемом файле. (Слушатель анимации всегда аварийно завершал работу, когда я использовал навигационный компонент.)
Luigi_Papardelle


9

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

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


            }
        });

1

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

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

вы можете сохранить несколько строк, используяfade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.