Comment effectuer une animation de fondu sur la transition d'activité?

89

Je codifie un effet de transition entre mon activité de logo et mon activité principale, mais j'ai le problème qu'avant de disparaître l'activité se déplace vers le haut:

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

Comment pourrais-je améliorer ce code pour obtenir seulement un effet de disparition?

MarcForn
la source

Réponses:

237

Vous pouvez créer vos propres fichiers d'animation .xml pour fondre dans un nouveau Activityet faire disparaître le courant 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" />

Utilisez-le dans un code comme celui-ci: (À l'intérieur de votre Activity)

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

Le code ci-dessus disparaîtra de l'actuel actif Activityet disparaîtra du nouveau démarré, Activityce qui entraînera une transition en douceur.

MISE À JOUR : @Dan J a souligné que l'utilisation des animations Android intégrées améliore les performances , ce que j'ai trouvé en effet être le cas après avoir fait quelques tests. Si vous préférez travailler avec les animations intégrées, utilisez:

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

Remarquez que je fais référence android.Rau lieu d' Raccéder à l'ID de la ressource.

MISE À JOUR : Il est désormais courant d'effectuer des transitions à l'aide de la classe Transition introduite au niveau d'API 19 .

Philipp Jahoda
la source
65
L'utilisation des animations Android intégrées semble entraîner une transition plus fluide: la overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);visualisation de ces fichiers peut également vous donner des conseils sur la façon d'améliorer vos animations personnalisées (par exemple, en prolongeant la durée du fondu avant).
Dan J
41
Il a un undescore: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban
Dois-je utiliser overridePendingTransition onCreate ou dans chaque intention? Ou dépend de ce que je veux? Merci.
Ricardo
19
Il y a une option sans " Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
remplacer
1
La transition ci-dessus est exécutée uniquement si elle est activée dans les options du développeur, voir stackoverflow.com/a/30422015/2914140 .
CoolMind
22

Il suffit de republier la réponse d' oleynikd parce que c'est simple et soigné

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);
Nikhil
la source
Étant donné que overridePendingTransition ne fonctionne pas dans certains mobiles et que la solution d'Enes n'est pas très agréable, cette réponse devrait être la bonne.
Hugo Passos
19

vous pouvez également ajouter une animation dans votre activité, dans la méthode onCreate comme ci-dessous, car overridePendingTransition ne fonctionne pas avec certains mobiles, ou cela dépend des paramètres de l'appareil ...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);
Enes
la source
1
Comment gérer l'animation pour l'activité précédente ou parent?
Mehmed
9
Pour définir l'animation de la transition vers l'activité parente, utilisez ce code: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
John Verco
15

vous pouvez également utiliser ce code dans votre fichier style.xml pour ne pas avoir besoin d'écrire autre chose dans votre 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>
Refnhaldy
la source