Wie führe ich eine Überblendungsanimation für den Aktivitätsübergang durch?

87

Ich kodifiziere einen Übergangseffekt zwischen meiner Logoaktivität und meiner Hauptaktivität, habe jedoch das Problem, dass die Aktivität vor dem Verschwinden nach oben verschoben wird:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>

</set>

Wie kann ich diesen Code verbessern, um nur einen Fluchteffekt zu erzielen?

MarcForn
quelle

Antworten:

233

Sie können Ihre eigenen XML-Animationsdateien erstellen , um eine neue Activityeinzufügen und die aktuelle auszublenden Activity:

fade_in.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="500" />

fade_out.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:fromAlpha="1.0" android:toAlpha="0.0"
           android:fillAfter="true"
           android:duration="500" />

Verwenden Sie es in Code wie folgt: (In Ihrem Activity)

Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

Der obige Code blendet den aktuell aktiven Activityund den neu gestarteten Code aus, Activitywas zu einem reibungslosen Übergang führt.

UPDATE : @Dan J wies darauf hin, dass die Verwendung der integrierten Android-Animationen die Leistung verbessert , was ich nach einigen Tests tatsächlich festgestellt habe. Wenn Sie lieber mit den integrierten Animationen arbeiten möchten, verwenden Sie:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

Beachten Sie, dass ich referenziere, android.Ranstatt Rauf die Ressourcen-ID zuzugreifen.

UPDATE : Es ist mittlerweile üblich, Übergänge mit der in API Level 19 eingeführten Transition-Klasse durchzuführen .

Philipp Jahoda
quelle
65
Die Verwendung der integrierten Android-Animationen scheint zu einem reibungsloseren Übergang zu führen: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);Wenn Sie diese Dateien anzeigen, erhalten Sie möglicherweise auch Hinweise, wie Sie Ihre benutzerdefinierten Animationen verbessern können (z. B. indem das Einblenden länger dauert als das Ausblenden).
Dan J
40
Es hat einen undescore: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban
Muss ich overridePendingTransition onCreate oder in jeder Absicht verwenden? Oder kommt es darauf an was ich will? Vielen Dank.
Ricardo
19
Es gibt eine Option ohne "Überschreiben":Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd
1
Der obige Übergang wird nur ausgeführt, wenn er in den Entwickleroptionen aktiviert ist (siehe stackoverflow.com/a/30422015/2914140) .
CoolMind
21

Einfach die Antwort von oleynikd erneut posten, weil es einfach und ordentlich ist

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);
Nikhil
quelle
Da overridePendingTransition in einigen Handys nicht funktioniert und Enes 'Lösung nicht sehr gut ist, sollte diese Antwort die richtige sein.
Hugo Passos
19

Sie können Ihrer Aktivität auch Animationen hinzufügen, und zwar in der onCreate-Methode wie unten, da overridePendingTransition mit einigen Mobilgeräten nicht funktioniert oder von den Geräteeinstellungen abhängt.

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);
Enes
quelle
1
Wie gehe ich mit Animationen für die vorherige oder übergeordnete Aktivität um?
Mehmed
9
Verwenden Sie diesen Code, um die Animation für den Übergang zurück zur übergeordneten Aktivität @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
festzulegen
15

Sie können diesen Code auch in Ihrer style.xml- Datei verwenden, sodass Sie nichts anderes in Ihre activity.java schreiben müssen

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AppTheme.WindowTransition</item>
</style>

<!-- Setting window animation -->
<style name="AppTheme.WindowTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
Refnhaldy
quelle
-1

Setzen Sie die folgende Zeile direkt nach Ihrem setContentView:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

Dadurch wird die Animation zum Ein- und Ausblenden zu Ihrer Aktivität hinzugefügt. Animationen werden bereits vom Android-System bereitgestellt, sodass keine Neuerstellung erforderlich ist.

Hoffe es wird dir helfen :)

Neo
quelle
Sie wiederholen nur die gleiche Antwort
Manti_Core