结束动画事件android

Pau*_*ros 82 android android-animation android-fragments

我在视图中有一个淡出动画(在片段内),每次动画发生时,视图结束后再次重绘.我发现了一项工作view.SetVisibility(View.GONE).但它并不等待动画完成.我想在动画完成后才执行此setVisibility代码.最好的方法是什么?

ble*_*enm 163

您可以将动画侦听器添加到动画对象中

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 如果要在动画进行过程中阻止淡出动画再次启动,请使用`if(!anim.hasStarted()|| anim.hasEnded())`来检测动画是否仍在运行. (4认同)

Ant*_*tzi 29

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

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

请享用 :)

  • 清晰和单衬。最佳答案!可以简单地使用 lambda `.withEndAction(() -> theView.setVisibility(View.GONE));` (3认同)
  • 请记住,这是API级别16(4.1)及更高级别. (2认同)

Gau*_*ora 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**


            }
        });
Run Code Online (Sandbox Code Playgroud)


Pav*_*van 8

您也可以使用Animation.setFillAfter实现此目的


ric*_*chc 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
        }
    })
Run Code Online (Sandbox Code Playgroud)