Animation de diapositives Android de gauche à droite

J’ai trois activités dont les modes de lancement sont à instance unique.
En utilisant onfling() , je les balance à gauche et à droite.

Le problème est que lorsque je glisse de droite à gauche, la transition des diapositives est correcte, mais quand je glisse de gauche à droite, la transition se fait de droite à gauche.

Je sais pourquoi cela se produit parce que j’envoie toujours de nouvelles intentions. Mais maintenant, je dois changer l’animation du glissement de gauche à droite.

Je sais qu’il existe une méthode nommée overridingTransitionPending() , mais je ne sais pas comment définir mon animation en XML.

Utilisez ce xml dans res/anim/

C’est pour l’animation de gauche à droite:

    

C’est pour l’animation de droite à gauche:

    

Dans votre utilisation de codage, utilisez l’intention de gauche à droite:

 this.overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave); 

Dans votre utilisation de codage, l’intention est de droite à gauche

 this.overridePendingTransition(R.anim.animation_leave, R.anim.animation_enter); 

Si vous voulez le travail de transition pour l’ensemble de l’application, vous pouvez créer une rootacivity et en hériter dans l’activité dont vous avez besoin. Dans onCreate de l’activité Racine, overridePendingTransition par la direction souhaitée. Et l’appel onStart overridePendingTransition avec une autre direction si l’activité est reprise. Ici, je donne le code complet ci-dessous. Corrigez-moi si je me trompe.

créer ce fichier xml sur votre dossier anim

anim_slide_in_left.xml

 < ?xml version="1.0" encoding="utf-8"?>     

anim_slide_in_right.xml

 < ?xml version="1.0" encoding="utf-8"?>     

anim_slide_out_left.xml

 < ?xml version="1.0" encoding="utf-8"?>     

anim_slide_out_right.xml

 < ?xml version="1.0" encoding="utf-8"?>     

RacineActivité

 import android.app.Activity; import android.os.Bundle; public class RootActivity extends Activity { int onStartCount = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); onStartCount = 1; if (savedInstanceState == null) // 1st time { this.overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left); } else // already created so reverse animation { onStartCount = 2; } } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); if (onStartCount > 1) { this.overridePendingTransition(R.anim.anim_slide_in_right, R.anim.anim_slide_out_right); } else if (onStartCount == 1) { onStartCount++; } } } 

Première activité

 import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class FirstActivity extends RootActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.tvTitle); tv.setText("First Activity"); Button bt = (Button) findViewById(R.id.buttonNext); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(FirstActivity.this, SecondActivity.class); startActivity(i); } }); } } 

Deuxième activité

 import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class SecondActivity extends RootActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.tvTitle); tv.setText("Second Activity"); Button bt = (Button) findViewById(R.id.buttonNext); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(SecondActivity.this, ThirdActivity.class); startActivity(i); } }); } } 

ThirdActivity

 import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class ThirdActivity extends RootActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.tvTitle); tv.setText("Third Activity"); Button bt = (Button) findViewById(R.id.buttonNext); bt.setText("previous"); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } } 

et enfin manifeste

 < ?xml version="1.0" encoding="utf-8"?>                

Faites un exemple de code implémentant le même avec des effets de diapositives de gauche, droite, haut et bas. (Pour ceux qui ne veulent pas faire tous ces fichiers xml anim :))

Sortez le code sur github

Vous pouvez aussi faire ceci:

 FirstClass.this.overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 

Et vous n’avez pas besoin d’append d’animation xml

Vous pouvez remplacer votre animation d’activité par défaut. Voici la solution que j’utilise:

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

    

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

slide_out_left.xml

 < ?xml version="1.0" encoding="utf-8"?>    

slide_in_left.xml

 < ?xml version="1.0" encoding="utf-8"?>    

slide_out_right.xml

 < ?xml version="1.0" encoding="utf-8"?>    

Ceci est mon exemple de projet dans github.

C’est tout … Heureux codage 🙂

Je n’ai pas trouvé de solution pour ce type d’animation avec ViewPropertyAnimator.

Voici un exemple:

Disposition:

    

Animer – Droite à gauche et quitter la vue:

 final childView = findViewById(R.id.child_view); View containerView = findViewById(R.id.child_view_container); childView.animate() .translationXBy(-containerView.getWidth()) .setDuration(TRANSLATION_DURATION) .setInterpolator(new AccelerateDecelerateInterpolator()) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { childView.setVisibility(View.GONE); } }); 

Animer – Droite à gauche entrer la vue:

 final View childView = findViewById(R.id.child_view); View containerView = findViewById(R.id.child_view_container); childView.setTranslationX(containerView.getWidth()); childView.animate() .translationXBy(-containerView.getWidth()) .setDuration(TRANSLATION_DURATION) .setInterpolator(new AccelerateDecelerateInterpolator()) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { childView.setVisibility(View.VISIBLE); } }); 

Si votre niveau d’API est 19+, vous pouvez utiliser la translation comme ci-dessus. Si votre niveau d’API est inférieur à 19, vous pouvez consulter un didacticiel similaire: http://sortingckyandroid.com/fragments-translate-animation/