Android结束动画事件

101

我在一个视图中使用了淡出动画(该视图位于一个片段内),每当动画发生时,动画结束后该视图会重新绘制。我找到了一个解决方法,即使用view.SetVisibility(View.GONE) 。但它不会等待动画完成。我想在动画完成后执行这个setVisibility代码。最好的方法是什么?


发布您的代码,以显示动画... - Lalit Poptani
5个回答

189

你可以向动画对象添加动画监听器,例如:

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

48

本质上与被接受的答案相同,但表述更加简洁明了:

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

祝愉快 :)


4
顶级答案!可以使用lambda表达式进行简化:.withEndAction(() -> theView.setVisibility(View.GONE)); - theBugger
2
请注意,这是API级别16(4.1)及以上。 - Tommie
太棒了,我的朋友。谢谢你! - Vlad Ivchenko
1
运行良好,即使在可运行的导航组件中使用时也是如此。(当我使用导航组件进行导航时,动画监听器总是崩溃。) - Luigi_Papardelle
用这种方式,更加高效:) - Thalis
显示剩余2条评论

10

只需获取您的动画对象并将动画监听器添加到其中。以下是示例代码:

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


            }
        });

9

7

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

你可以使用以下代码来节省一些行数:fade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start() - longi
注释:必须使用fadeOutImage.startAnimation(animation),而不是fadeOutImage = animation。 - Dimitri Leurs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接