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.


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.


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.


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 :)


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.


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;

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


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... :)


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

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.


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


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é.


1

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

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

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.


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

"overridePendingTransition" sera appelé après la méthode startActivity ()
Sanjay Goswami
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.