结束动画事件android


90

我在一个视图(位于片段内)中有一个淡入淡出的动画,每次动画完成后,该视图都会重新绘制自己。我发现周围有工作view.SetVisibility(View.GONE)。但是,它不会等待动画完成。我只想在动画完成后执行此setVisibility代码。最好的方法是什么?


发表您的代码是如何显示的动画....
拉利特Poptani

Answers:


171

您可以将Animation侦听器添加到动画对象,例如

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 2014年

34

在功能上与接受的答案相同,但更为简洁:

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

请享用 :)


2
清晰而单线。最佳答案!可以简单地使用lambda来实现.withEndAction(() -> theView.setVisibility(View.GONE));
TheBugger

2
请记住,这是API级别16(4.1)及更高版本。
Tommie

太棒了,我的朋友。谢谢!
弗拉德·伊夫琴科

重要信息:-仅在动画正常结束时才执行该操作,如果在该动画过程中取消了ViewPropertyAnimator,则可运行对象将不会运行。
Sarthak_ssg5

在可运行对象中使用导航组件时,其工作方式也像一个超级按钮。(当我使用导航组件导航时,动画侦听器alwys崩溃了。)
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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.