onAnimationEnd is not getting called, onAnimationStart works fine

后端 未结 14 1606
情书的邮戳
情书的邮戳 2020-12-23 19:51

I\'ve a ScrollView in the PopupWindow. I\'m animating ScrollView contents using TranslateAnimation.

When animation starts, the onAnimationStart listener is called bu

相关标签:
14条回答
  • 2020-12-23 20:17

    Also, when using animations, don't forget the setFillAfter() to true.

    http://developer.android.com/reference/android/view/animation/Animation.html#setFillAfter(boolean)

    If fillAfter is true, the transformation that this animation performed will persist when it is finished. Defaults to false if not set. Note that this applies when using an AnimationSet to chain animations. The transformation is not applied before the AnimationSet itself starts.

    anim.setFillAfter(true);
    mToolbar.startAnimation(anim);
    
    0 讨论(0)
  • 2020-12-23 20:21

    For anyone stumbling upon this question: Consider switching over to using the Property Animation system instead http://developer.android.com/guide/topics/graphics/prop-animation.html

    I've had several problems with the old way of animating a fade-in/out on a view (through AlphaAnimation). OnAnimationEnd was not being called etc ... With the Property Animation all those problems were resolved.

    If you want to support API<11 devices, Jake Wharton's https://github.com/JakeWharton/NineOldAndroids is the way to go

    0 讨论(0)
  • 2020-12-23 20:21

    The delay is probably due to the anim.setDuration(1000) or if you are doing this on a thread, then probably due to context switching. Try manipulating the delay time and see if you notice any difference.

    0 讨论(0)
  • 2020-12-23 20:22

    AnimationEnd is not reliable. If you don't want to rewrite your code with custom views that override OnAnimationEnd, use postDelayed.

    Here's some example code:

    final FadeUpAnimation anim = new FadeUpAnimation(v);
    anim.setInterpolator(new AccelerateInterpolator());
    anim.setDuration(1000);
    anim.setFillAfter(true);
    new Handler().postDelayed(new Runnable() {
        public void run() {
            v.clearAnimation();
            //Extra work goes here
        }
    }, anim.getDuration());
    v.startAnimation(anim);
    

    While it MAY seem ugly, I can guarantee it's very reliable. I use it for ListViews that are inserting new rows while removing with animation to other rows. Stress testing a listener with AnimationEnd proved unreliable. Sometimes AnimationEnd was never triggered. You might want to reapply any transformation in the postDelayed function in case the animation didn't fully finish, but that really depends on what type of animation you're using.

    0 讨论(0)
  • 2020-12-23 20:22

    Make sure that you are USING view.startAnimation(Animation) AND NOT view.setAnimation(Animation). This simple confusion may be a problem.

    0 讨论(0)
  • 2020-12-23 20:22

    Where do you start your animation ? If in onCreate, it is wrong. Try to do it in onResume.

    0 讨论(0)
提交回复
热议问题