Aktivitätsübergang in Android

188

Wie kann ich den Übergang zwischen zwei Aktivitäten für Android 1.5 und höher definieren? Ich möchte, dass eine Aktivität eingeblendet wird.

hpique
quelle
7
Gilt für alle overridePendingTransitionunten stehenden Antworten: Sie können bestehen, (0, 0)wenn Sie überhaupt keine Animation wünschen.
Dokkaebi

Antworten:

164

Sie können dies mit tun Activity.overridePendingTransition(). Sie können einfache Übergangsanimationen in einer XML-Ressourcendatei definieren.

iandisme
quelle
Danke iandisme. overridePengingTransition ist API-Level 5. Ist dies für Level 3 (Android 1.5) nicht möglich?
Hpique
Ah, du hast recht. Die Antwort von CaseyB entspricht wahrscheinlich eher dem, wonach Sie suchen.
Iandisme
Ich habe noch nicht herausgefunden, wie ich mit CaseyBs Antwort richtig einblenden kann.
Hpique
1
Sie können dies in der onCreateFunktion Ihrer Aktivität tun .
mxcl
1
Auf dem HTC müssen Sie Einstellungen> Anzeige> Animation auf alle ändern, damit es funktioniert (oder zumindest auf dem HTC Desire HD).
Urboss
191

Hier ist der Code für eine schöne, gleichmäßige Überblendung zwischen zwei Aktivitäten.

Erstellen Sie eine Datei mit dem Namen fadein.xmlinres/anim

<?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="2000" />

Erstellen Sie eine Datei mit dem Namen fadeout.xmlinres/anim

<?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:duration="2000" />

Wenn Sie von Aktivität A zu Aktivität B wechseln möchten, geben Sie Folgendes in die onCreate()Methode für Aktivität B ein . Vorher setContentView()arbeitet für mich.

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

Wenn die Überblendungen für Sie zu langsam sind, ändern Sie android:durationdie obigen XML-Dateien in etwas Kleineres.

Ben Clayton
quelle
53
Nur um das hinzuzufügen. overridePendingTransition () muss erneut aufgerufen werden, nachdem das Betriebssystem beschlossen hat, Ihre Aktivität zu schließen. Ich habe gerade einen weiteren identischen Aufruf zum Überschreiben von PendingTransition (Fadein, Fadeout) in die onPause () -Methode der Aktivität eingefügt. Andernfalls wird die Aktivität eingeblendet, beim Schließen jedoch nicht ausgeblendet.
Nate
2
Keine Antworten auf anderen Thread. Ich lösche es. Was ich erlebe, ist, dass der Übergang sofort erfolgt und dann dunkel wird und eingeblendet wird. Ich bin also bei Aktivität A und Aktivität B wird angezeigt, wird dann dunkel und wird eingeblendet. Ich habe ihn dann geändert, um den Anweisungen mit zu folgen Fügen Sie den Code zu onPause () von Aktivität A hinzu und erhalten Sie das gleiche Verhalten.
Geeks On Hugs
12
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
3
Vergiss nur nicht, dich zu ändern fadeinund fadeoutzu fade_inund fade_out. Von Dan Js Post
Farid
1
Laut den Dokumenten sollten Sie overridePendingTransition()direkt nach dem Anruf finish()und / oder anrufen startActivity(). Auf diese Weise konnte ich eine schöne Überblendung erzielen, indem ich sie direkt nach dem Start der neuen Aktivität aufrief.
Ionoclast Brigham
50

Eine noch einfachere Möglichkeit ist:

  1. Erstellen Sie einen Animationsstil in Ihrer Datei styles.xml
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. Fügen Sie diesen Stil Ihrem App-Thema hinzu
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Das ist es :)

Felipe Conde
quelle
31

Ja. Sie können dem Betriebssystem mitteilen, welche Art von Übergang Sie für Ihre Aktivität wünschen.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

Wobei ANIMATION eine Ganzzahl ist, die sich auf eine im Betriebssystem integrierte Animation bezieht.

CaseyB
quelle
Muss ich noch etwas tun, damit es funktioniert? getWindow (). setWindowAnimations (android.R.anim.fade_in) führt nicht zu dem standardmäßig verwendeten Push-Übergang, ist aber auch kein Fade-Übergang. Die neue Aktivität wird nur über der vorherigen Aktivität in einem Nexus One-Gerät angezeigt.
Hpique
1
Das liegt daran, dass hier nicht nach einer Ressource gefragt wird, sondern nach der ID einer in das Betriebssystem integrierten Übergangsanimation. developer.android.com/intl/fr/reference/android/view/…
CaseyB
4
Es scheint, dass setWindowAnimations nur Stilressourcen akzeptiert. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) ist das, was ich einem Einblenden am nächsten gefunden habe, aber es wird von Schwarz ausgeblendet, nicht von der vorherigen Aktivität.
Hpique
1
Es muss keine Animation im Betriebssystem eingebaut sein, Sie können eine benutzerdefinierte in Werten definieren.
ilija139
1
@ ilija139, bist du sicher? Hier steht developer.android.com/reference/android/view/… : "Dies muss eine Systemressource sein; es kann keine Anwendungsressource sein, da der Fenstermanager keinen Zugriff auf Anwendungen hat."
Lapis
29

Erstelle res> anim> fadein.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" />

Erstelle res> anim> fadeout.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:duration="500" />

In res> values> styles.xml

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

In Aktivitäten onCreate ()

getWindow().getAttributes().windowAnimations = R.style.Fade;
IceSteve
quelle
2
Ich würde vorschlagen, es einem Thema hinzuzufügen, damit es auf alle Aktivitäten angewendet wird.
Peterdk
12
Diese Animationen sind bereits in Android definiert. Fügen Sie einfach den folgenden Code in onPause () aller Aktivitäten hinzu:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava
Ja, ich wollte nur zeigen, dass die Animation nach Belieben der Entwickler bearbeitet werden kann.
IceSteve
29

Eine Liste der Standardanimationen finden Sie unter: http://developer.android.com/reference/android/R.anim.html

Es gibt in der Tat fade_inund fade_outfür API Level 1 und höher.

Kevin C. Krinke
quelle
2
zB getWindow (). setWindowAnimations (android.R.anim.slide_in_left);
Pierre
5
Prost, ich habe überraschend lange gebraucht, um diese zu finden.
Georgiecasey
25

Ich überschreibe meine Standardaktivitätsanimation. Ich teste es in API 15, dass es reibungslos funktioniert. Hier ist die Lösung, die ich benutze:

<!-- 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/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Erstellen Sie einen Animationsordner unter dem Ordner res und erstellen Sie dann diese vier Animationsdateien:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Sie können mein Beispielprojekt herunterladen .

Das ist alles... :)

Shohan Ahmed Sijan
quelle
Dies sollte die akzeptierte Antwort sein. Funktioniert gut!
EdgeDev
24

Hier ist der Code, um eine schöne Glättung zwischen zwei Aktivitäten durchzuführen.

  1. sanfter Effekt von links nach rechts

    Erstellen Sie eine Datei mit den Namen slide_in_right.xml und slide_out_right.xml in res / anim

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. sanfter Effekt von rechts nach links

    Erstellen Sie in res / anim eine Datei mit den Namen animation_enter.xml und animation_leave.xml

    animation_enter.xml

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700"/>
       </set>

    animation_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. Navigieren Sie von einer Aktivität zur zweiten Aktivität

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4. Drücken Sie auf Ereignis zurück oder navigieren Sie von der zweiten Aktivität zu einer Aktivität

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();
Sachin Pangare
quelle
3
Die overridePendingTransition sollte nach startActivity in 3.
Arberg
Die overridePendingTransition sollte nach startActivity in 3 und 4
Tareq
Es funktioniert nicht für mich, wenn overridePendingTransition () vor startActivity ()
Fernando Tan
Sollte overridePendingTransitionsofort nach startActivity anrufen: developer.android.com/reference/android/app/…
Midhun MP
4

Sie können overridePendingTransition in Android 1.5 nicht verwenden. overridePendingTransistion wurde für Android 2.0 bereitgestellt.

Wenn Sie dies ohne Fehler durchlaufen möchten, müssen Sie mit den normalen Animationen (oder Ihren eigenen) für das Ziel (1.5 oder höher) kompilieren oder mit overridePendingTransistion für das Ziel (2.0 oder höher) kompilieren.

Zusammenfassung: Sie können overridePendingTransistion in Android 1.5 nicht verwenden .

Sie können jedoch die im Betriebssystem integrierten Animationen verwenden.

Vorhang
quelle
Das ist nicht richtig. Animationen sind in Android weit vor 1.6 und Sie können overridePendingTransistion mit Reflektion verwenden, um weiterhin auf 1.5 zu zielen.
Hpique
Nun, mein Fehler. Mein Beitrag wurde aktualisiert. Sie können sicherlich Ihre eigenen Animationen erstellen und sie in 1.5 nach Ihren Wünschen anpassen. Sie können overridePendingTransition jedoch immer noch nicht verwenden, da es in API-Level 5
Curtain
2

IN GALAXY Geräte:

Sie müssen sicherstellen, dass Sie es im Gerät nicht über Einstellungen> Entwickleroptionen deaktiviert haben:

zwei Muppets

Maher Ismaail
quelle
sogar für LG-Geräte :)
Ultimo_m
Ich denke schon, aber ich versuche es nicht
Maher Ismaail
Fantastisch! Ich habe Ihre Antwort nach mehreren Stunden der Suche nach Übergängen und Animationen gefunden.
CoolMind
1

Verwenden Sie die ActivityCompat.startActivity () -Arbeits-API> 21.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());
Muhammad Aamir Ali
quelle
1

Bevor Sie mit Ihrer Absicht beginnen:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

Dies gibt Ihrem Aktivitätsübergang eine Standardanimation.

devDeejay
quelle
0

Einige Versionen von Android unterstützen benutzerdefinierte ActivityÜbergänge, andere nicht (ältere Geräte). Wenn Sie benutzerdefinierte Übergänge verwenden möchten, sollten Sie überprüfen, ob Activitydie overridePendingTransition()Methode vorhanden ist, wie dies bei älteren Versionen nicht der Fall ist.

Um festzustellen, ob die Methode vorhanden ist oder nicht, kann die Reflection-API verwendet werden. Hier ist der einfache Code, der die Methode überprüft und zurückgibt, falls vorhanden:

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

Und dann können wir unseren eigenen Übergang anwenden, dh diese Methode verwenden, falls vorhanden:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

Hier wurden als Beispiel einfache Ein- und Ausblendanimationen für die Übergangsdemonstration verwendet.

Serj Ardovic
quelle
0

Animation verkleinern

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

<?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" />

zoom_exit

<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" />

quelle