Wie kann ich eine Animation bereitstellen, wenn ich eine andere Aktivität in Android aufrufe?

115

Ich habe zwei Aktivitäten A und B. Ich möchte die Animation verkleinern, wenn Aktivität A B aufruft, und die Animation maximieren, wenn Aktivität B A aufruft. Ich benötige dafür keine XML-Animationsdateien.

Wenn wir eine andere Aktivität in Android aufrufen, wird die Standardanimation und anschließend die Schrumpfanimation aufgerufen.

Ich möchte, dass die Standardanimation nicht und die gewünschte Animation angezeigt wird.

Können wir die Animation tatsächlich geben, wenn wir eine andere Aktivität aufrufen?

sunil
quelle

Antworten:

144

Seit API 16 können Sie beim Aufrufen von Context.startActivity (Intent, Bundle) oder verwandten Methoden ein Aktivitätsoptionspaket bereitstellen . Es wird über den Builder ActivityOptions erstellt :

Intent myIntent = new Intent(context, MyActivity.class);
ActivityOptions options = 
   ActivityOptions.makeCustomAnimation(context, R.anim.fade_in, R.anim.fade_out);
context.startActivity(myIntent, options.toBundle());

Vergessen Sie nicht, die anderen Methoden des Builders ActivityOptions und des ActivityOptionsCompat zu überprüfen, wenn Sie die Support-Bibliothek verwenden.



API 5+:

Für Apps mit API-Level 5+ gibt es die Activities- overridePendingTransitionMethode. Für die eingehenden und ausgehenden Animationen sind zwei Ressourcen-IDs erforderlich. Eine ID von 0deaktiviert die Animationen. Rufen Sie dies sofort nach dem startActivityAnruf an.

dh:

startActivity(new Intent(this, MyActivity.class));
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

API 3+:

Sie können die Standardanimation (von rechts einschieben) mit der Intent.FLAG_ACTIVITY_NO_ANIMATIONFlagge in Ihrer Absicht verhindern.

dh:

Intent myIntent = new Intent(context, MyActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(myIntent);

Dann müssen Sie in Ihrer Aktivität einfach Ihre eigene Animation angeben.

Dies funktioniert auch für die 1.5-API (Stufe 3).

whlk
quelle
4
Was meinst du, wenn du sagst "gib deine eigene Animation an"? Wie machst Du das? Vielen Dank!
pqn
Ich habe die gleiche Frage. Wahrscheinlich in der Startanimation in onResume und onPause.
Tima
Gibt es eine Möglichkeit, stattdessen Animator zu verwenden?
Android-Entwickler
Sie können dasselbe auch nach dem Aufruf von finish () verwenden!
Thiagolr
Ist es nicht R.anim.fade_inimmer noch eine XML-Dateianimation, die wir haben sollen res\anim ?
Alex Jolig
78

Sie müssen die OverridePendingTransition-Methode verwenden, um dies zu erreichen. Diese befindet sich in der Activity-Klasse . Beispielanimationen im res / anim-Ordner des Apidemos-Beispiels. Prüfen Sie. Mehr als die Demo in ApiDemos / App / Activity / Animation überprüfen .

Beispiel:

@Override
public void onResume(){
    // TODO LC: preliminary support for views transitions
    this.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}
Praveen
quelle
1
Danke für die Antwort. Die Methode overridePendingTransition wird von API Level 5 unterstützt, und ich möchte, dass die Anwendung von Android 1.5 unterstützt wird. Gibt es eine andere Möglichkeit, Animationen von einer Aktivität zur anderen bereitzustellen?
Sunil
5
genial! Es macht viel Spaß, mit
jemandem
@ Sunil Ich habe die gleiche Frage wie Ihre. Könnten Sie das Problem lösen? Animation mit API Level 3 oder 4 (nicht 5)
Dr. Jacky
Wenn Sie den Animationscode in onResume () belassen, wird die Animation abgespielt, wenn der Benutzer die App verlässt und zurückkommt. Nicht ideal in vielen Apps.
Vihaan Verma
Ich musste hinzufügen super.onResume();, bekam: "android.util.SuperNotCalledException: Aktivität {com.abc.MyActivity} hat nicht zu super.onResume () aufgerufen"
Gene Bo
3

Jelly Bean unterstützt dies mit der ActivityOptions.makeCustomAnimation () -Methode. Da es sich nur um Jelly Bean handelt, ist es für praktische Zwecke natürlich ziemlich wertlos.

Phreakhead
quelle
5
Es ist nicht mehr wertlos :)
Greg Ennis
Verwenden ActivityOptionsCompatSie diese Option, wenn Sie auf Pre-JellyBean abzielen.
Thuy Trinh