Comment puis-je ajouter une animation à la fin de l'activité ()


98

J'utilise overridePendingTransition lorsque mon activité est créée et que cela fonctionne bien, je peux voir que le fondu fonctionne très bien, mais lorsque j'essaie d'animer la fin de l'activité, il fait toujours la diapositive par défaut de droite à gauche.

J'ai d'abord essayé de définir l'animation de sortie lorsque je démarre l'activité comme suit:

Intent myIntent = new Intent(a, SkdyAlert.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    a.startActivity(myIntent);
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
        AnimationHelper.overridePendingTransition(a, R.anim.fadein, R.anim.fadeout);
    }

Ensuite, j'ai essayé de le faire quand j'ai fini l'activité aussi

okBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            finish();
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
                AnimationHelper.overridePendingTransition(activity, 0, R.anim.fadeout);
            }
        }
    });

Mais aucune de ces approches n'empêchera le glissement «de droite à gauche» pour l'animation de sortie. Des idées sur ce que je fais mal?

Réponses:


228

Je remplace la transition en attente juste après avoir appelé finish ();

Dans mon cas, je l'ai fait pour éviter les transitions.

finish();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

L'ordre est important :)


5
par "Détails", @Goofyahead nomme son activité englobante - ymmv. Cette technique a fonctionné pour moi pour remplacer une animation de Theme.Dialog sur 2.x, mais pas 3.x ou 4.x
larham1

8
À quoi ça R.anim.nothingressemble?
sandalone

Utilisez la réponse @Felipe Micaroni Lalli, 0 signifie pas d'animation.
Yeung

Cela m'a aidé aussi. Il explique comment définir vos propres animations: stackoverflow.com/questions/5151591/…
Adam

23
Vous pouvez remplacer la finish()méthode pour éviter les transitions dans tous les cas (bouton retour enfoncé, comme exemple): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek

29

Cette question a déjà répondu mais le moyen le plus efficace de mettre une animation en sortant d'une activité est de remplacer la méthode "finish ()" de l'activité associée:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}

24

Je suggérerais d'utiliser la méthode isFinishing () pour configurer les animations à onPause au lieu d'appeler finish ()

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()){
        overridePendingTransition(R.anim.activity_slide_in, R.anim.activity_slide_out);
    }

}

Pourquoi est-ce mieux?
Manuel


19

J'ai résolu ce problème en utilisant ce type d'approche:

ouvrir avec animation:

 Intent newUser = new Intent(getBaseContext(), NewUserActivity.class);
    startActivity(newUser);
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);

Pour fermer avec animation:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_out_right,R.anim.slide_in_right);
}

12

Essayez de le faire à travers un thème. Vous pouvez définir des animations d'entrée de sortie pour les activités ou l'ensemble de l'application


OUI! C'était ça. Eh bien un peu. J'avais déjà appliqué un thème et le thème avait une animation définie, c'est pourquoi je ne pouvais pas faire fonctionner ma propre animation. Merci beaucoup pour la perspicacité!
b-ryce

3
pouvez-vous me donner un indice où chercher quelles transistions seront livrées par les thèmes. Je voudrais également définir une transition personnalisée vers tous les sites, mais je ne sais pas comment.
LuckyMalaka

@Zapnologica cette autre réponse que j'ai donnée pour une question similaire l'explique un peu plus. stackoverflow.com/questions/4940574/…
Nathan Schwermann

6

Suite à la réponse de @schwiz, voici un remplacement d'animation pour le thème Dialog intégré, où j'ai défini des animations locales slide_up et slide_down. Mon activité spécifie le thème MyDialog afin de faire entrer et sortir ces transitions.

<style name="Animation.MyDialog" parent="android:Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

<style name="Theme.MyDialog" parent="android:Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/Animation.MyDialog</item>
</style>


5

Utilisez startActivityForResult pour démarrer votre activité enfant et dans onActivityResult () de votre activité parent:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_YOUR_ACTIVITY) {
        overridePendingTransition(R.anim.parent_appearing_anim, R.anim.child_dissmissing_anim);
    }
    super.onActivityResult(requestCode, resultCode, arg2);
}

Cela fonctionne sur la presse arrière (bouton physique). Pour que cela fonctionne également avec la flèche "haut", voir cette réponse: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- cliqué / 20161352 # 20161352
lenooh

Important à noter: overridePendingTransition doit être appelé avant d'appeler super.onActivityResult. Sinon, la transition pendante ne sera pas annulée!
goemic le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.