Transition d'activité dans Android

193

Comment définir la transition entre deux activités pour Android 1.5 et versions ultérieures? J'aimerais qu'une activité disparaisse.

hpique
la source
7
S'applique à toutes les overridePendingTransitionréponses ci-dessous: Vous pouvez réussir (0, 0)si vous ne voulez aucune animation.
dokkaebi

Réponses:

166

Vous pouvez le faire avec Activity.overridePendingTransition(). Vous pouvez définir des animations de transition simples dans un fichier de ressources XML.

iandisme
la source
Merci iandisme. overridePengingTransition est le niveau de l'API 5. N'est-il pas possible de faire cela pour le niveau 3 (Android 1.5)?
hpique
Ah, tu as raison. La réponse de CaseyB correspond probablement davantage à ce que vous recherchez.
iandisme
Je n'ai pas encore trouvé comment faire un fondu approprié avec la réponse de CaseyB.
hpique
1
Vous pouvez le faire dans la onCreatefonction de votre activité .
mxcl
1
Sur HTC, vous devez modifier les paramètres> affichage> animation à tous pour que cela fonctionne (ou du moins sur HTC Desire HD).
Urboss
193

Voici le code pour effectuer un bon fondu en douceur entre deux activités.

Créez un fichier appelé fadein.xmldansres/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" />

Créez un fichier appelé fadeout.xmldansres/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" />

Si vous voulez effacer de l' activité A à l' activité B , mettre ce qui suit dans la onCreate()méthode de l' activité B . Avant setContentView()travaille pour moi.

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

Si les fondus sont trop lents pour vous, remplacez android:durationles fichiers xml ci-dessus par quelque chose de plus petit.

Ben Clayton
la source
56
Juste pour ajouter à cela. overridePendingTransition () devra être appelé à nouveau, juste après que le système d'exploitation décide de fermer votre activité. Je viens de mettre un autre appel identique à overridePendingTransition (fadein, fadeout) dans la méthode onPause () de Activity. Sinon, vous verrez l'activité apparaître en fondu, mais pas disparaître lorsqu'elle est fermée.
Nate
2
Aucune réponse sur un autre fil. Je le supprime. Ce que je vis, c'est ce qui se passe, c'est que la transition se produit immédiatement, puis il s'assombrit et s'estompe. Je suis donc sur l'activité A et l'activité B s'affiche, puis s'assombrit et s'estompe. Je l'ai ensuite modifiée pour suivre les instructions avec ajouter le code à onPause () de l'activité A et obtenir le même comportement.
Geeks On Hugs
12
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
3
N'oubliez pas de changer fadeinet fadeoutde fade_inet fade_out. From Dan J's post
Farid
2
Selon la documentation, vous devez appeler overridePendingTransition()juste après avoir appelé finish()et / ou startActivity(). J'ai pu obtenir un joli fondu de cette façon en l'appelant juste après le lancement de la nouvelle activité.
Ionoclast Brigham
52

Un moyen encore plus simple de le faire est:

  1. Créez un style d'animation dans votre fichier 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. Ajoutez ce style à votre thème d'application
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

C'est ça :)

Felipe Condé
la source
31

Oui. Vous pouvez indiquer au système d'exploitation le type de transition que vous souhaitez avoir pour votre activité.

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

    ...

}

Où ANIMATION est un entier faisant référence à une animation intégrée dans le système d'exploitation.

CaseyB
la source
Dois-je faire autre chose pour que cela fonctionne? getWindow (). setWindowAnimations (android.R.anim.fade_in) n'entraîne pas la transition push qui a été utilisée par défaut, mais ce n'est pas non plus une transition de fondu. La nouvelle activité apparaît juste au-dessus de la précédente dans un appareil Nexus One.
hpique
1
En effet, cela ne demande pas de ressource, mais l'identifiant d'une animation de transition intégrée au système d'exploitation. developer.android.com/intl/fr/reference/android/view/…
CaseyB
4
Il semble que setWindowAnimations n'accepte que les ressources de style. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) est le plus proche que j'ai trouvé d'un fondu, mais il disparaît du noir, pas l'activité précédente.
hpique
1
Il n'est pas nécessaire de créer une animation dans le système d'exploitation, vous pouvez en définir une personnalisée dans les valeurs.
ilija139
1
@ ilija139, êtes-vous sûr? Il dit ici developer.android.com/reference/android/view/… : "Cela doit être une ressource système; cela ne peut pas être une ressource d'application car le gestionnaire de fenêtres n'a pas accès aux applications."
lapis
29

créer 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" />

créer 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" />

Dans res> values> styles.xml

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

Dans les activités surCréer ()

getWindow().getAttributes().windowAnimations = R.style.Fade;
IceSteve
la source
2
Je suggérerais de l'ajouter à un thème pour qu'il soit appliqué à toutes les activités?
Peterdk
12
Ces animations sont déjà définies sous Android, il suffit d'ajouter le code suivant dans onPause () de toutes les activités:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava
Oui, je voulais juste montrer que l'animation peut être éditée au goût des développeurs.
IceSteve
29

Pour une liste des animations par défaut, voir: http://developer.android.com/reference/android/R.anim.html

Il existe en fait fade_inet fade_outpour les API de niveau 1 et plus.

Kevin C. Krinke
la source
2
par exemple getWindow (). setWindowAnimations (android.R.anim.slide_in_left);
Pierre
5
Cheers, m'a pris un temps étonnamment long pour les trouver.
georgiecasey
27

J'écrase mon animation d'activité par défaut. Je le teste dans l'API 15 pour qu'il fonctionne correctement. Voici la solution que j'utilise:

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

Créez un dossier anim sous le dossier res, puis créez ces quatre fichiers d'animation:

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>

Vous pouvez télécharger mon exemple de projet .

C'est tout... :)

Shohan Ahmed Sijan
la source
Cela devrait être la réponse acceptée. Fonctionne bien!
EdgeDev
24

Voici le code pour faire une belle fluidité entre deux activités.

  1. effet lisse de gauche à droite

    Créez un fichier appelé slide_in_right.xml et slide_out_right.xml dans 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. effet lisse de droite à gauche

    Créez un fichier appelé animation_enter.xml et animation_leave.xml dans res / anim

    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. Naviguez d'une activité à une seconde activité

       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. sur l'événement de presse de retour ou naviguer d'une deuxième activité à une activité

     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
la source
3
Le overridePendingTransition devrait être après startActivity dans 3.
arberg
Le remplacementPendingTransition doit être après startActivity dans 3 et 4
Tareq
Cela ne fonctionne pas pour moi si overridePendingTransition () mis avant startActivity ()
Fernando Tan
Doit appeler overridePendingTransitionimmédiatement après startActivity: developer.android.com/reference/android/app/…
Midhun MP
4

Vous ne pouvez pas utiliser overridePendingTransition dans Android 1.5. overridePendingTransistion est venu à Android 2.0.

Si vous voulez passer par là sans aucune erreur, vous devez compiler pour la cible (1.5 ou supérieure) en utilisant les animations ordinaires (ou que vous possédez) ou vous devez compiler pour la cible (2.0 ou supérieure) en utilisant overridePendingTransistion.

Résumé: vous ne pouvez pas utiliser overridePendingTransistion dans Android 1.5 .

Vous pouvez cependant utiliser les animations intégrées dans le système d'exploitation.

Rideau
la source
Ce n'est pas correct. Les animations sont dans Android bien avant 1.6 et vous pouvez utiliser overridePendingTransistion avec réflexion pour toujours cibler 1.5.
hpique
Eh bien, mon erreur. J'ai mis à jour mon message. Vous pouvez sûrement créer vos propres animations et les personnaliser comme vous le souhaitez dans la version 1.5. Mais vous ne pouvez toujours pas utiliser overridePendingTransition car il a commencé à apparaître au niveau de l'API 5.
Curtain
2

Appareils IN GALAXY:

Vous devez vous assurer que vous ne l'avez pas désactivé sur l'appareil à l'aide des paramètres> Options du développeur:

deux muppets

Maher Ismaail
la source
même pour les appareils LG :)
Ultimo_m
Je pense que oui, mais je ne l'essaie pas
Maher Ismaail
Fantastique! J'ai trouvé votre réponse après plusieurs heures de recherche de transitions et d'animations.
CoolMind
2

Avant de commencer votre intention:

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

Cela donne une animation par défaut à votre transition d'activité.

devDeejay
la source
1

Utilisez l'API ActivityCompat.startActivity () works> 21.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());
Muhammad Aamir Ali
la source
0

Certaines versions d'Android prennent en charge les Activitytransitions personnalisées et d'autres non (appareils plus anciens). Si vous souhaitez utiliser des transitions personnalisées, il est recommandé de vérifier si le Activitya la overridePendingTransition()méthode, comme sur les anciennes versions, ce n'est pas le cas.

Pour savoir si la méthode existe ou non, l'API de réflexion peut être utilisée. Voici le code simple qui vérifiera et retournera la méthode si elle existe:

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 */
    } 

Et puis, nous pouvons appliquer notre propre transition, c'est-à-dire utiliser cette méthode si elle existe:

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();
               }
            }

Ici, à titre d'exemple, de simples animations de fondu d'entrée et de sortie ont été utilisées pour la démonstration de transition.

Serj Ardovic
la source
0

zoom arrière animation

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

la source
"overridePendingTransition" sera appelé après la méthode startActivity ()
Sanjay Goswami