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?

b-ryce
la source

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 :)

Goofyahead
la source
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);
}
Bahadir Tasdemir
la source
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);
    }

}
Pablo A. Martínez
la source
Pourquoi est-ce mieux?
Manuel
20
finish();
overridePendingTransition(0, 0);
Felipe
la source
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);
}
Deivison Sporteman
la source
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

Nathan Schwermann
la source
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>

larham1
la source
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);
}
Chris.Zou
la source
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