l'animation android n'est pas terminée dans onAnimationEnd


4 Answers

J'étais abe pour résoudre cela en appelant clearAnimation () sur la vue animée à l'intérieur onAnimationEnd , qui a enlevé le scintillement C'est bizarre pourquoi n'importe qui devrait faire cela, car le rappel OnAnimationEnd aurait dû être appelé seulement si l'animation est déjà terminée. Mais je suppose que la réponse réside dans la profondeur de Framework sur la manière dont view / layout gère le callback de l'animation. Pour l'instant, prenez-le comme une solution sans bidouille, cela fonctionne tout simplement.

        animation.setAnimationListener(new AnimationListener() {

        public void onAnimationEnd(Animation anim) {
            innerView.clearAnimation();   // to get rid of flicker at end of animation

            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams
            (innerBlockContainer.getWidth(), innerBlockContainer.getHeight());

            /* Update lp margin, left/top to update layout after end of Translation */
            ViewGroup parent_ofInnerView = (ViewGroup)innerView.getParent();
            vp.updateViewLayout(innerBlockContainer, lp);

        }

        public void onAnimationRepeat(Animation arg0) {}

        public void onAnimationStart(Animation arg0) {
        }

    });

     innerView.startAnimation(animation);
Question

Il semble qu'une animation android n'est pas vraiment terminée lorsque l'événement onAnimationEnd est déclenché bien que animation.hasEnded soit défini sur true.

Je veux que ma vue change son arrière-plan dessinable à la fin de son ScaleAnimation , mais vous pouvez voir clairement qu'il est modifié quelques millisecondes avant la fin. Le problème est, qu'il scintille parce que le nouvel arrière-plan apparaît (= est) mis à l'échelle pendant une courte période jusqu'à ce que l'animation se termine vraiment.

Existe-t-il un moyen d'obtenir la fin réelle de l'animation ou d'empêcher que le nouveau fond ne soit mis à l'échelle pendant cette courte période de temps?

Je vous remercie!

// EDIT: J'utilise un AnimationListener pour obtenir l'appel suivant:

    @Override
public void onAnimationEnd(Animation animation)
{
    View view = (MyView) ((ExtendedScaleAnimation) animation).getView();

    view.clearAnimation();
    view.requestLayout();
    view.refreshBackground(); // <-- this is where the background gets changed
}



Si vous utilisez le nombre de répétitions comme infini, alors onAnimationEnd ne serait pas appelé. Vérifiez le link la documentation




Essayez d'utiliser getAnimation () depuis votre objet:

public void onShowListBtnClick(View view)
    {
        rightPanel.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.slide_left));

        rightPanel.getAnimation().setAnimationListener(new Animation.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) {
                // write your code here
            }
        });
}



J'ai eu le même problème et l'ai résolu en utilisant

view.clearAnimation();

avant

view.startAnimation(anim);



Annimation peut également être arrêté sur la rotation de l'écran. dans ce cas onAnimationEnd () n'est pas appelé. ma solution de contournement:

 animation.setDuration(animationDuration);
 animation.setAnimationListener(new AnimationListenerAdapter() {...});
 view.startAnimation(animation);
 handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if(!animation.hasEnded()) {
                    // here you can handle this case
                }
            }
        }, animationDuration + 100);





Related