web-dev-qa-db-fra.com

Transition d'activité sous Android

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

177
hpique

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

161
iandisme

Voici le code pour faire un joli fondu entre deux activités.

Créez un fichier appelé fadein.xml dans res/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.xml dans res/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 souhaitez disparaître de Activité A en Activité B , indiquez ce qui suit dans la méthode onCreate() pour Activité B . Avant setContentView() fonctionne pour moi.

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

Si les fondus sont trop lents pour vous, changez Android:duration dans les fichiers xml ci-dessus en quelque chose de plus petit.

180
Ben Clayton

Un moyen encore facile 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. Ajouter 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 tout :)

40
Felipe Conde

Oui. Vous pouvez indiquer au SE quel type de transition vous souhaitez 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 au système d'exploitation.

31
CaseyB

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

Il existe en effet fade_in et fade_out pour les API de niveau 1 et supérieur.

29
Kevin C. Krinke

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> valeurs> styles.xml 

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

Dans les activités onCreate ()

getWindow().getAttributes().windowAnimations = R.style.Fade;
28
IceSteve

Voici le code pour faire une belle douceur 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. Naviguer d'une activité à une autre 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. Appuyez sur l'événement précédent ou naviguez 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();
    
22
sachin pangare

Je remplace mon animation d'activité par défaut. Je teste dans api 15 que cela fonctionne bien. 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... :)

19

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

Si vous allez traverser cela sans aucune erreur, vous devez compiler pour la cible (1.5 ou plus) en utilisant les animations ordinaires (ou vous-même) ou vous devez compiler pour la cible (2.0 ou plus) 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.

4
Curtain

DANS GALAXY Devices:

Vous devez vous assurer de ne pas l'avoir éteint sur l'appareil en utilisant Paramètres> Options pour les développeurs:

two muppets

2
Maher Ismaail

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
devDeejay

Utilisez ActivityCompat.startActivity () works API> 21.

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

Certaines versions d’Android prennent en charge les transitions personnalisées Activity et d’autres pas (appareils plus anciens). Si vous souhaitez utiliser des transitions personnalisées, il est recommandé de vérifier si la variable Activity a la méthode overridePendingTransition(), contrairement aux versions précédentes.

Pour savoir si la méthode existe ou non, une API de réflexion peut être utilisée. Voici le code simple qui va vérifier et renvoyer 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 ensuite, 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 en fondu ont été utilisées pour la démonstration de transition.

0
Serj Ardovic

zoom avant sur l'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" />
0
user8356857