web-dev-qa-db-fra.com

Comment appliquer une animation de diapositive entre deux activités sous Android?

Je souhaite obtenir un effet de glissement de gauche à droite lorsque je passe d'une activité à une autre. Pour cela, j'utilise le code suivant, mais je n'obtiens aucun résultat. S'il vous plaît corrigez-moi.

En Java, les deux fichiers:

super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);

Deux fichiers dans le répertoire res/anim: 

fadein.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="5000"
    Android:fromAlpha="0.0"
    Android:interpolator="@Android:anim/slide_out_right"
    Android:toAlpha="1.0" >
</alpha>

fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="5000"
    Android:fromAlpha="0.0"
    Android:interpolator="@Android:anim/slide_in_left"
    Android:toAlpha="1.0" >
</alpha>
44
Jignesh Ansodariya
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);

         new Handler().postDelayed(new Runnable() {
             public void run() {

                     /* Create an intent that will start the main activity. */
                     Intent mainIntent = new Intent(SplashScreen.this,
                             ConnectedActivity.class);
                     mainIntent.putExtra("id", "1");

                     //SplashScreen.this.startActivity(mainIntent);
                     startActivity(mainIntent);
                     /* Finish splash activity so user cant go back to it. */
                     SplashScreen.this.finish();

                     /* Apply our splash exit (fade out) and main
                        entry (fade in) animation transitions. */
                     overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
             }
     }, SPLASH_DISPLAY_TIME);   
    }
28
MAC

Ajoutez ces deux fichiers dans le dossier res/anim.

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:Android="http://schemas.Android.com/apk/res/Android" 
   Android:duration="@Android:integer/config_longAnimTime" 
   Android:fromXDelta="100%p" 
   Android:toXDelta="0%p"/>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:Android="http://schemas.Android.com/apk/res/Android" 
   Android:duration="@Android:integer/config_longAnimTime" 
   Android:fromXDelta="0%p" 
   Android:toXDelta="-100%p"/>

Et écrivez le code suivant dans la méthode onCreate () de la prochaine activité que vous transmettez dans l'intention.

overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
141
Born To Win

Vous pouvez écraser votre animation d'activité par défaut pour qu'elle soit plus performante que overridePendingTransition. J'utilise cette solution qui fonctionne pour toutes les versions d'Android. Il suffit de copier/coller 4 fichiers et d’ajouter un style de 4 lignes comme ci-dessous:

Créez un "CustomActivityAnimation" et ajoutez-le à votre thème de base par "windowAnimationStyle".

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

Ensuite, créez le dossier anim sous le dossier res puis créez ces quatre fichiers d’animation dans le dossier anim:

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>

Si vous rencontrez un problème, vous pouvez télécharger mon exemple de projet depuis github .

Merci

45

Glisser vers le haut/bas avec animation alpha avec quelques notes

enter image description here

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@integer/activity_transition_time"
    >
    <translate
        Android:fromYDelta="100%p"
        Android:toYDelta="0"/>
    <alpha
        Android:fromAlpha="0.5"
        Android:toAlpha="1"/>
</set>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@integer/activity_transition_time"
    >
    <translate
        Android:fromYDelta="0"
        Android:toYDelta="100%p"/>
    <alpha
        Android:fromAlpha="1"
        Android:toAlpha="0.5"/>
</set>

no_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@integer/activity_transition_time"
    Android:fromYDelta="0"
    Android:toYDelta="0"/>

Première activité

startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up,  R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate

Deuxième activité

finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);

Terminé

PLUS
J'essaie de créer une animation de diapositive semblable à une animation iOS lorsqu'un modèle de vue est présenté (comme ceci https://www.youtube.com/watch?v=deZobvh2064 } _) mais j'ai échoué. 

En regardant l'animation actuelle d'iOS, vous verrez: L'animation du bas avec alpha (environ 50%), puis elle va très vite, puis plus lentement, la durée de l'animation est d'environ 500 ms (j'utilise des outils de découpe vidéo pour compter le temps d'animation https://www.kapwing.com/trim-video donc il ne peut pas exactement à 100%) 

Ensuite, j'essaie de postuler sur Android.
Pour faire de l'alpha, j'utilise <alpha> et succès.
Pour que l’animation démarre plus vite que plus lentement, j’utilise Android:interpolator="a decelerate interpolator" mais cela a presque échoué. 

Il y a 3 decelerate interpolator par défaut dans Android
@Android:interpolator/decelerate_quad -> facteur = 1
@Android:interpolator/decelerate_cubic -> facteur = 1,5
@Android:interpolator/decelerate_quint _> facteur = 2,5
(facteur plus élevé <=> l’animation démarre plus rapidement au début et plus lentement à la fin)
Voici un bon tutoriel http://cogitolearning.co.uk/2013/10/Android-animations-tutorial-5-more-on-interpolators/ pour le comprendre

J'ai essayé 3 ci-dessus, je ne peux pas atteindre comme iOS, l'animation ne peut pas démarrer plus vite que iOS. Ensuite, je crée un outil personnalisé avec un facteur = 3, comme

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:factor="3" />

et j'augmente la durée de 500 -> 750. Cela fonctionne bien (très similaire à iOS). Cependant, cela ne fonctionne que sur certains appareils, mais l'animation est assez lente sur certains appareils. Par la suite, je sais que l’animation peut varier d’un appareil à l’autre (par exemple, certains appareils seront plus rapides et d’autres plus lentement), de sorte que je ne peux pas en faire une animation similaire sur tous les appareils Android. Par conséquent, je n'utilise pas interpolator. Je ne sais pas si mes tests sont exactement à 100% ou non, mais j'espère que cette expérience aidera

4
Linh

Vous pouvez utiliser overridePendingTransition dans startActivity au lieu de onCreate. Au moins, ça marche pour moi!

Voir un exemple complet ici . Cela inclut une animation (inversée) sur BackPressed, donc en revenant à l'activité précédente! Dans votre exemple spécifique (ouverture/fermeture en fondu), cela peut être inutile.

1
P Kuijpers

Voici une animation de diapositives pour vous.

 enter image description here

Disons que vous avez deux activités. 

  1. MovieDetailActivity
  2. AllCastActivity 

Et sur un clic de bouton, cela se produit.

 enter image description here

Vous pouvez y parvenir en 3 étapes simples

1) Activer la transition de contenu

Accédez à votre style.xml et ajoutez cette ligne pour activer la transition de contenu.

<item name="Android:windowContentTransitions">true</item>

2) Écrire la transition d'entrée et de sortie par défaut pour votre AllCastActivity

public void setAnimation()
{
    if(Build.VERSION.SDK_INT>20) {
        Slide slide = new Slide();
        slide.setSlideEdge(Gravity.LEFT);
        slide.setDuration(400);
        slide.setInterpolator(new AccelerateDecelerateInterpolator());
        getWindow().setExitTransition(slide);
        getWindow().setEnterTransition(slide);
    }
}

3) Commencez l'activité avec l'intention 

Écrivez cette méthode dans votre MovieDetailActivity pour commencer AllCastActivity

public void startActivity(){

Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putStringArrayListExtra(MOVIE_LIST, movie.getImages());

  if(Build.VERSION.SDK_INT>20)
   {
       ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(BlankActivity.this);
       startActivity(i,options.toBundle());
   }
   else {
       startActivity(i);
   }
}

Le plus important!

placez votre méthode setAnimation()method avant setContentView() sinon l’animation ne fonctionnera pas.
Donc, votre AllCastActivity.Java devrait ressembler à ceci

 class AllCastActivity extends AppcompatActivity {

   @Override
   protected void onCreate(Bundle savedInstaceState)
   {
      super.onCreate(savedInstaceState);

      setAnimation();

      setContentView(R.layout.all_cast_activity);

      .......
   }

   private void setAnimation(){

      if(Build.VERSION.SDK_INT>20) {
      Slide slide = new Slide();
      slide.setSlideEdge(Gravity.LEFT);
      ..........
  }
}
0
Rohit Singh

L'animation de diapositives peut être appliquée aux transitions d'activité en appelant overridePendingTransition et en transmettant des ressources d'animation pour les activités d'entrée et de sortie.

Les animations de diapositive peuvent être glissées vers la droite, vers la gauche, vers le haut et vers le bas.

Glisser vers le haut

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:interpolator="@Android:anim/linear_interpolator">
    <scale
        Android:duration="800"
        Android:fromXScale="1.0"
        Android:fromYScale="1.0"
        Android:toXScale="1.0"
        Android:toYScale="0.0" />
</set>

Glisse vers le bas

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:interpolator="@Android:anim/linear_interpolator">
    <scale
        Android:duration="800"
        Android:fromXScale="1.0"
        Android:fromYScale="0.0"
        Android:toXScale="1.0"
        Android:toYScale="1.0" />
</set>

overridePendingTransition (R.anim.slide_down, R.anim.slide_up);

Voir exemples d'animation de transition d'activité pour plus d'exemples de transition d'activité.

0
Arnav Rao

Exemple Kotlin:

 private val SPLASH_DELAY: Long = 1000
    internal val mRunnable: Runnable = Runnable {
        if (!isFinishing) {
            val intent = Intent(applicationContext, HomeActivity::class.Java)
            startActivity(intent)
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
            finish()
        }
    }


   private fun navigateToHomeScreen() {
        //Initialize the Handler
        mDelayHandler = Handler()

        //Navigate with delay
        mDelayHandler!!.postDelayed(mRunnable, SPLASH_DELAY)

    }

    public override fun onDestroy() {

        if (mDelayHandler != null) {
            mDelayHandler!!.removeCallbacks(mRunnable)
        }

        super.onDestroy()
    }

mettre les animations dans le dossier anim:

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="@Android:integer/config_longAnimTime"
        Android:fromXDelta="100%p"
        Android:toXDelta="0%p">
</translate>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="@Android:integer/config_longAnimTime"
        Android:fromXDelta="0%p"
        Android:toXDelta="-100%p">
</translate>

USAGE

  navigateToHomeScreen();
0
Hitesh Sahu