Wie kann ich dem Ende der Aktivität eine Animation hinzufügen ()


98

Ich verwende overridePendingTransition, wenn meine Aktivität erstellt wird und das gut funktioniert. Ich kann sehen, dass das Einblenden gut funktioniert, aber wenn ich versuche, das Ende der Aktivität zu animieren, wird immer noch die Standardfolie von rechts nach links ausgeführt.

Ich habe zuerst versucht, die Out-Animation zu definieren, wenn ich die Aktivität wie folgt starte:

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);
    }

Dann habe ich es versucht, als ich die Aktivität beendet habe

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);
            }
        }
    });

Keiner dieser Ansätze verhindert jedoch die Folie "von rechts nach links" für die Exit-Animation. Irgendwelche Ideen, was ich falsch mache?

Antworten:


227

Ich überschreibe den ausstehenden Übergang direkt nach dem Aufruf von finish ().

In meinem Fall habe ich es getan, um Übergänge zu vermeiden.

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

Ordnung ist wichtig :)


5
mit "Details" nennt @Goofyahead seine einschließende Aktivität - ymmv. Diese Technik funktionierte für mich, um eine Animation von Theme.Dialog auf 2.x zu ersetzen, aber nicht 3.x oder 4.x
larham1

8
Wie sieht es R.anim.nothingaus?
Sandalone

Verwenden Sie die Antwort von @Felipe Micaroni Lalli, 0 bedeutet keine Animation.
Yeung

Das hat mir auch geholfen. Es erklärt, wie Sie Ihre eigenen Animationen definieren: stackoverflow.com/questions/5151591/…
Adam

23
Sie können die finish()Methode überschreiben , um Übergänge in allen Fällen zu vermeiden (Zurück-Taste gedrückt, als Beispiel): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
Eugenek

29

Diese Frage wurde bereits beantwortet. Der effizienteste Weg, eine Animation beim Beenden einer Aktivität zu platzieren, besteht darin, die Methode "finish ()" der zugehörigen Aktivität zu überschreiben:

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

24

Ich würde vorschlagen, die Methode isFinishing () zu verwenden, um die Animationen bei onPause zu konfigurieren, anstatt finish () aufzurufen.

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

}

Warum ist das besser?
Manuel


19

Ich habe dieses Problem mit diesem Ansatz behoben:

mit Animation öffnen:

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

So schließen Sie mit der 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

Schauen Sie sich das anhand eines Themas an. Sie können Enter-Exit-Animationen für Aktivitäten oder die gesamte Anwendung definieren


JA! Das war's. Na irgendwie. Ich hatte bereits ein Thema angewendet und für das Thema wurde eine Animation definiert. Deshalb konnte ich meine eigene Animation nicht zum Laufen bringen. Vielen Dank für den Einblick!
b-ryce

3
Können Sie mir einen Hinweis geben, wo ich nachsehen soll, welche Übergänge von den Themen geliefert werden? Ich möchte auch einen benutzerdefinierten Übergang für alle Websites festlegen, aber ich weiß nicht wie.
LuckyMalaka

@Zapnologica Diese andere Antwort, die ich für eine ähnliche Frage gegeben habe, beschreibt es ein bisschen mehr. stackoverflow.com/questions/4940574/…
Nathan Schwermann

6

Nach der Antwort von @schwiz finden Sie hier eine Animationsüberschreibung für das integrierte Dialog-Thema, in dem ich lokale slide_up- und slide_down-Animationen definiert habe. Meine Aktivität gibt das Thema MyDialog an, damit diese Übergänge ein- und ausgehen.

<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

Verwenden Sie startActivityForResult, um Ihre untergeordnete Aktivität und in onActivityResult () Ihrer übergeordneten Aktivität zu starten:

    @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);
}

Dies funktioniert beim Zurückdrücken (physische Taste). Weitere Informationen finden Sie in der folgenden Antwort: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- geklickt / 20161352 # 20161352
lenooh

Wichtig zu beachten: overridePendingTransition muss aufgerufen werden, bevor super.onActivityResult aufgerufen wird. Andernfalls wird der Pendint-Übergang nicht überschrieben!
goemic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.