Fim do evento de animação android

90

Eu tenho uma animação de fadeout em uma visão (que está dentro de um fragmento), e toda vez que a animação acontece, depois que termina a visão se redesenha novamente. Eu encontrei um jeito de fazer view.SetVisibility(View.GONE). Mas não espera a animação terminar. Eu gostaria de executar este código setVisibility somente depois que a animação terminar. Qual o melhor jeito pra fazer isso?

Paulo Barros
fonte
Poste seu código como você está exibindo a animação ....
Lalit Poptani

Respostas:

171

Você pode adicionar ouvinte de animação ao seu objeto de animação, como

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
bênção
fonte
5
Se você quiser evitar que a animação de esmaecimento comece novamente enquanto a animação está em andamento, use if (!anim.hasStarted() || anim.hasEnded())para detectar se a animação ainda está em execução.
sessão checa de
34

Funcionalmente igual à resposta aceita, mas de uma forma muito mais concisa:

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

Aproveitar :)

Antzi
fonte
2
Claro e de uma linha. Melhor resposta! Pode ser simplificado com o uso de lambda.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger
2
Lembre-se de que esta é a API de nível 16 (4.1) e superior.
Tommie
Solução incrível, meu amigo. Obrigado!
Vlad Ivchenko,
Informação importante: - A ação só é executada se a animação terminar normalmente, se ViewPropertyAnimator for cancelado durante a animação, o executável não será executado.
Sarthak_ssg5
Funciona perfeitamente, também ao usar o componente de navegação no executável. (O ouvinte de animação sempre travava quando eu estava navegando com o componente de navegação.)
Luigi_Papardelle
9

Simplesmente pegue seu objeto de animação e adicione ouvinte de animação a ele. Aqui está o código de exemplo:

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


            }
        });
Gaurav Arora
fonte
1

Exemplo para Kotlin

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
        }
    })
richc
fonte
você pode salvar algumas linhas usandofade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi