I have an ImageView
that I use to show progress via an AnimationDrawable
. When I want to show my progress spinner, I do this:
animDrawable.start();
ObjectAnimator.ofFloat(view, "alpha", 1.0f).setDuration(300).start();
When I want to hide the spinner, I do this:
ObjectAnimator.ofFloat(view, "alpha", 0.0f).setDuration(300).start();
animDrawable.stop();
However, this has the effect that the animation stops immediately. I would like it to stop only after the ObjectAnimator
has completely faded to 0.0 alpha. Is there a way I can setup something along the lines of an "AnimationCompleted" callback?
The more modern way of doing this is to use the ViewPropertyAnimator
:
view.animate()
.alpha(0f)
.withEndAction(new Runnable() {
@Override
public void run() {
// Do something.
}
})
.start();
Or, if you're using RetroLambda:
view.animate()
.alpha(0f)
.withEndAction(() -> {
// Do something.
})
.start();
To your original question about the ObjectAnimator object you can set up an Animator.AnimatorListener object which defines several animation state callbacks. You want to override public void onAnimationEnd(Animator animation)
animation.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
Toast.makeText(VideoEditorActivity.this, "animation ended", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
With androidx you can use doOnEnd method which invoked when the animation has ended
val anim = ObjectAnimator.ofFloat(eva_image, View.TRANSLATION_Y, 0f, 500f)
anim.setDuration(500)
anim.doOnEnd { Toast.makeText(this, "Anim End", Toast.LENGTH_SHORT).show() }
anim.start()
You could also look into postOnAnimation(Runnable)
Link to Docs: postOnAnimation(java.lang.Runnable)