Check if AnimatorSet has finished animation?
20,786
Solution 1
You can set an AnimatorListener on fadeinAnimation5. This will give you an onAnimationEnd callback.
fadeinAnimation5.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
// ...
}
@Override
public void onAnimationRepeat(Animator animation) {
// ...
}
@Override
public void onAnimationEnd(Animator animation) {
// ...
}
@Override
public void onAnimationCancel(Animator animation) {
// ...
}
});
Or, as suggested by slott use an AnimatorListenerAdapter
fadeinAnimation5.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// ...
}
}
Solution 2
I was having a similar problem and here is how I solved it:
private void crossFadeAnimation(final View fadeInTarget, final View fadeOutTarget, long duration){
AnimatorSet mAnimationSet = new AnimatorSet();
ObjectAnimator fadeOut = ObjectAnimator.ofFloat(fadeOutTarget, View.ALPHA, 1f, 0f);
fadeOut.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
fadeOutTarget.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
fadeOut.setInterpolator(new LinearInterpolator());
ObjectAnimator fadeIn = ObjectAnimator.ofFloat(fadeInTarget, View.ALPHA, 0f, 1f);
fadeIn.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
fadeInTarget.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}
});
fadeIn.setInterpolator(new LinearInterpolator());
mAnimationSet.setDuration(duration);
mAnimationSet.playTogether(fadeOut, fadeIn);
mAnimationSet.start();
}
Solution 3
You can actually set a listener to the AnimatorSet directly since AnimatorSet inherits from Animator. Here's some code:
import android.animation.Animator;
AnimatorSet setQuestion = new AnimatorSet();
setQuestion.playSequentially(fadeinAnimationQ,fadeinAnimation1,fadeinAnimation2,fadeinAnimation3,fadeinAnimation4,fadeinAnimation5);
setQuestion.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
// !! turn on your onClickListener here !!
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
setQuestion.start();
Related videos on Youtube
Comments
-
Zen about 4 years
I'm trying to animate buttons with fade in animation using
AnimatorSet
Button fades in > Click button > Remaining buttons fade out
So in order to do this, I want to set the
onClickListner after the animation is completed
, but that doesn't seem to work. Clicking a button in the middle of the animationtriggers the onClick action
:setQuestion = new AnimatorSet(); setQuestion.playSequentially(fadeinAnimationQ,fadeinAnimation1,fadeinAnimation2,fadeinAnimation3,fadeinAnimation4,fadeinAnimation5); setQuestion.start();
This is the method that checks
if the animation has finished
.private void checkAnimation() { while (true) { // Check if animation has ended if (setQuestion.isRunning() == false) { assignListners(); break; } } }
-
Zen about 10 yearsHere is how you can add an AnimatorListner: stackoverflow.com/questions/7274001/…
-
-
slott over 7 yearsIf you do not need all the events you could go for AnimatorListenerAdapter which keeps things a bit more simple.
-
Henrik Gyllensvärd almost 7 yearsA note of warning I fell for. The onAnimationEnd callback is called both if the animation finished OR was cancelled. To get notified only when the animation finished, use withEndAction(Runnable ) instead.