54 votes

onAnimationEnd n'est pas appelé, onAnimationStart fonctionne bien

J'ai un ScrollView dans le PopupWindow. Je suis d'animer le ScrollView contenu à l'aide de TranslateAnimation.

Lors de l'animation commence, le onAnimationStart auditeur est appelé, mais le onAnimationEnd n'est pas appelé. Des idées ?

Mise en page :

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:background="@drawable/popup_window_bg"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
  <View
     android:layout_width="@dimen/toolbar_padding_left"
     android:layout_height="@dimen/toolbar_height"/>
  <ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+web/toolbar"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:scrollbars="none"
     android:visibility="invisible">
    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">

       ...

    </LinearLayout>
  </ScrollView>
</LinearLayout>

Code d'Animation :

mToolbar = mPopupContents.findViewById( R.web.toolbar );
TranslateAnimation anim =
    new TranslateAnimation(0, 0, -60, 0);
anim.setDuration(1000);
anim.setAnimationListener(new Animation.AnimationListener() {
        public void onAnimationStart(Animation a) {
            Log.d(LOGTAG, "---- animation start listener called"  );
        }
        public void onAnimationRepeat(Animation a) {}
        public void onAnimationEnd(Animation a) {
            Log.d(LOGTAG, "---- animation end listener called"  );
        }
    });
mToolbar.startAnimation(anim);

Mise à jour : j'ai vérifié que le onAnimationEnd est appelée, mais elle est appelée après un certain délai (à condition de ne pas commencer la nouvelle animation au cours de l'époque).

62voto

ShortFuse Points 562

AnimationEnd n'est pas fiable. Si vous ne voulez pas de réécrire votre code avec des vues personnalisées qui remplacent OnAnimationEnd, utilisez postDelayed.

Voici un exemple de 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);

Même si cela PEUT sembler laid, je peux vous garantir que c'est très fiable. Je l'utilise pour les ListViews que sont l'insertion de nouvelles lignes lors du retrait de l'animation à d'autres lignes. Les Stress tests de l'auditeur avec AnimationEnd s'est avéré peu fiable. Parfois, AnimationEnd n'a jamais été déclenché. Vous pourriez réappliquer toute transformation dans l' postDelayed , si l'animation n'est pas complètement fini, mais cela dépend vraiment de ce type d'animation que vous utilisez.

10voto

Lisitso Points 217

Après que je ne me rappelle plus comment les publications pouvaient être lues et les jours consacrés à la recherche d'une solution à ce problème, j'ai découvert que si l'objet à déplacer ne se trouvait pas dans la région Screen (par exemple, il est positionné en dehors des coordonnées de l'écran), le rappel OnAnimationEnd ne reçoit pas. appelé. Probablement l'animation échoue juste après le début (la méthode start est appelée, j'ai codé un écouteur) mais rien n'est écrit dans logcat. Peut-être que ce n'est pas exactement votre cas, mais cela a finalement résolu mon problème et j'espère que cela pourra vous aider aussi.

3voto

Entreco Points 3950

Aussi, lors de l'utilisation d'animations, n'oubliez pas l' setFillAfter() de true.

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

Si fillAfter est vrai, la transformation de cette animation réalisée persiste quand c'est fini. Par défaut à false si pas ensemble. Notez que cela s'applique lors de l'utilisation d'un AnimationSet de la chaîne d'animations. La transformation n'est pas appliquée avant la AnimationSet lui-même commence.

anim.setFillAfter(true);
mToolbar.startAnimation(anim);

2voto

MrMaffen Points 454

Pour toute personne tombant sur cette question: Envisagez de basculer à l'aide de la Propriété système d'Animation de la place http://developer.android.com/guide/topics/graphics/prop-animation.html

J'ai eu plusieurs problèmes avec l'ancienne façon de l'animation d'un fade-in/out sur une vue (par le biais de AlphaAnimation). OnAnimationEnd n'était pas demandé, etc ... Avec la Propriété de l'Animation tous ces problèmes ont été résolus.

Si vous souhaitez soutenir l'API<11 appareils, Jake de Wharton https://github.com/JakeWharton/NineOldAndroids est le chemin à parcourir

-1voto

NeTeInStEiN Points 7331

Ne configurez-vous pas une autre animation avant celle que vous attendez?

Sans contexte, il est difficile de comprendre si c'est quelque chose comme ça ... mais c'est probablement l'une des seules causes possibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X