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.