Come eseguire un'animazione di dissolvenza sulla transizione di attività?


89

Sto codificando un effetto di transizione tra la mia attività del logo e la mia attività principale, ma ho il problema che prima di svanire l'attività si sposta in alto:

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

Come potrei migliorare questo codice per ottenere solo un effetto svanito?

Risposte:


237

Puoi creare i tuoi file di animazione .xml per sfumare in un nuovo Activitye sfumare l'attuale 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" />

Usalo in un codice come quello: (Dentro il tuo Activity)

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

Il codice sopra si dissolverà in quello attualmente attivo Activitye si dissolverà in quello appena avviato, Activityottenendo una transizione graduale.

AGGIORNAMENTO : @ Dan J ha sottolineato che l'utilizzo delle animazioni Android integrate migliora le prestazioni , cosa che ho effettivamente riscontrato dopo aver eseguito alcuni test. Se preferisci lavorare con le animazioni incorporate, usa:

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

Notatemi fare riferimento android.Rinvece di Raccedere all'ID risorsa.

AGGIORNAMENTO : è ormai pratica comune eseguire transizioni utilizzando la classe Transition introdotta nel livello API 19 .


65
L'uso delle animazioni Android integrate sembra portare a una transizione più fluida: la overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);visualizzazione di questi file può anche darti suggerimenti su come migliorare le tue animazioni personalizzate (ad esempio, facendo durare la dissolvenza in entrata più a lungo della dissolvenza in chiusura).
Dan J

41
Ha un undescore: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban

Devo usare overridePendingTransition onCreate o in ogni Intent? O dipende da quello che voglio? Grazie.
Ricardo

19
C'è un'opzione senza "override":Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd

1
La transizione di cui sopra viene eseguita solo se abilitata nelle Opzioni sviluppatore, vedere stackoverflow.com/a/30422015/2914140 .
CoolMind

22

Sto solo ripubblicando la risposta di oleynikd perché è semplice e chiara

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);

Poiché overridePendingTransition non funziona su alcuni cellulari e la soluzione di Enes non è molto carina, questa risposta dovrebbe essere quella corretta.
Hugo Passos

19

puoi anche aggiungere un'animazione alla tua attività, nel metodo onCreate come di seguito perché overridePendingTransition non funziona con alcuni dispositivi mobili o dipende dalle impostazioni del dispositivo ...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);

1
Come gestire l'animazione per l'attività precedente o principale?
Mehmed

9
Per impostare l'animazione per il ritorno all'attività genitore usa questo codice: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
John Verco

15

puoi anche usare questo codice nel tuo file style.xml così non devi scrivere nient'altro nel tuo activity.java

<!-- 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.