Fragment transaction animation: glisser et glisser

J'ai vérifié quelques tutoriels pour animer les transactions entre les fragments. J'ai utilisé cette méthode pour l'animation:

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 

et il fonctionne. Mais je veux que l'animation soit inversée: un vieux fragment glisse vers la gauche et un nouveau fragment se glisse vers la droite, mais aucune valeur du fichier R.anim ne semble utile pour ma portée. Comment puis-je le faire?

  • Android: Comment puis-je arrêter une animation infinie appliquée sur un ImageView?
  • Facebook Android SDK & java.lang.NullPointerException
  • Comment faire partie du texte Bold dans Android en cours d'exécution?
  • ExpandableListView effondre tous les éléments parent
  • XMPP et Android
  • ListView OnItemClickListener ne répond pas?
  • ViewPager avec les limites de la page précédente et suivante
  • Comment modifier la couleur du diviseur enfant de ExpanableListView par fichier de mise en page xml?
  • Mettre à jour les éléments dans un objet JSON
  • Comment compter le nombre d'enregistrements en sqlite dans Android
  • Taille de l'écran Android, valeurs-v11, valeurs-v14
  • Changer le nom du périphérique Bluetooth Android
  • 2 Solutions collect form web for “Fragment transaction animation: glisser et glisser”

    UPDATE Pour Android v19 + voir ce lien via @Sandra

    Vous pouvez créer vos propres animations. Placez les fichiers XML d'animation en res > anim

    Enter_from_left.xml

     <?xml version="1.0" encoding="utf-8"?> <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> 

    Enter_from_right.xml

     <?xml version="1.0" encoding="utf-8"?> <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> 

    Exit_to_left.xml

     <?xml version="1.0" encoding="utf-8"?> <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> 

    Exit_to_right.xml

     <?xml version="1.0" encoding="utf-8"?> <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> 

    UTILISATION (notez que l'ordre dans lequel vous appelez les méthodes sur la transaction importe. Ajoutez l'animation avant d'appeler .replace, .commit):

     FragmentTransaction transaction = supportFragmentManager.beginTransaction(); transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left); transaction.replace(R.id.content_frame, fragment); transaction.addToBackStack(null); transaction.commit(); 

    C'est une autre solution que j'utilise:

     public class CustomAnimator { private static final String TAG = "com.example.CustomAnimator"; private static Stack<AnimationEntry> animation_stack = new Stack<>(); public static final int DIRECTION_LEFT = 1; public static final int DIRECTION_RIGHT = -1; public static final int DIRECTION_UP = 2; public static final int DIRECTION_DOWN = -2; static class AnimationEntry { View in; View out; int direction; long duration; } public static boolean hasHistory() { return !animation_stack.empty(); } public static void reversePrevious() { if (!animation_stack.empty()) { AnimationEntry entry = animation_stack.pop(); slide(entry.out, entry.in, -entry.direction, entry.duration, false); } } public static void clearHistory() { animation_stack.clear(); } public static void slide(final View in, View out, final int direction, long duration) { slide(in, out, direction, duration, true); } private static void slide(final View in, final View out, final int direction, final long duration, final boolean save) { ViewGroup in_parent = (ViewGroup) in.getParent(); ViewGroup out_parent = (ViewGroup) out.getParent(); if (!in_parent.equals(out_parent)) { return; } int parent_width = in_parent.getWidth(); int parent_height = in_parent.getHeight(); ObjectAnimator slide_out; ObjectAnimator slide_in; switch (direction) { case DIRECTION_LEFT: default: slide_in = ObjectAnimator.ofFloat(in, "translationX", parent_width, 0); slide_out = ObjectAnimator.ofFloat(out, "translationX", 0, -out.getWidth()); break; case DIRECTION_RIGHT: slide_in = ObjectAnimator.ofFloat(in, "translationX", -out.getWidth(), 0); slide_out = ObjectAnimator.ofFloat(out, "translationX", 0, parent_width); break; case DIRECTION_UP: slide_in = ObjectAnimator.ofFloat(in, "translationY", parent_height, 0); slide_out = ObjectAnimator.ofFloat(out, "translationY", 0, -out.getHeight()); break; case DIRECTION_DOWN: slide_in = ObjectAnimator.ofFloat(in, "translationY", -out.getHeight(), 0); slide_out = ObjectAnimator.ofFloat(out, "translationY", 0, parent_height); break; } AnimatorSet animations = new AnimatorSet(); animations.setDuration(duration); animations.playTogether(slide_in, slide_out); animations.addListener(new Animator.AnimatorListener() { @Override public void onAnimationCancel(Animator arg0) { } @Override public void onAnimationEnd(Animator arg0) { out.setVisibility(View.INVISIBLE); if (save) { AnimationEntry ae = new AnimationEntry(); ae.in = in; ae.out = out; ae.direction = direction; ae.duration = duration; animation_stack.push(ae); } } @Override public void onAnimationRepeat(Animator arg0) { } @Override public void onAnimationStart(Animator arg0) { in.setVisibility(View.VISIBLE); } }); animations.start(); } } 

    L'utilisation de la classe. Disons que vous avez deux fragments (fragments de liste et de détails) comme indiqué ci-dessous

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ui_container" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/list_container" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/details_container" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" /> </FrameLayout> 

    Usage

     View details_container = findViewById(R.id.details_container); View list_container = findViewById(R.id.list_container); // You can select the direction left/right/up/down and the duration CustomAnimator.slide(list_container, details_container,CustomAnimator.DIRECTION_LEFT, 400); 

    Vous pouvez utiliser la fonction CustomAnimator.reversePrevious(); Pour obtenir la vue précédente lorsque l'utilisateur a réussi.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.