Animación de transacción de fragmentos: deslice hacia adentro y deslícela hacia afuera

Revisé algunos tutoriales para transacciones animadas entre fragmentos. He usado este método para la animación:

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

y funciona. Pero quiero que la animación se invierta: el viejo fragmento se desliza hacia la izquierda y el nuevo fragmento se desliza hacia la derecha, pero el valor del archivo R.anim no parece ser útil para mi scope. ¿Cómo puedo hacerlo?

ACTUALIZAR Para Android v19 + ver este enlace a través de @Sandra

Puede crear sus propias animaciones. Coloque los archivos XML de animación en res > anim

enter_from_left.xml

     

enter_from_right.xml

     

exit_to_left.xml

     

exit_to_right.xml

     

USO (tenga en cuenta que importa el orden en que llame a los métodos en la transacción. Agregue la animación antes de llamar a .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(); 

Hay tres formas de animación de transacción en fragmento.

Transiciones

Entonces, necesita usar una de las Transiciones incorporadas, use el método setTranstion ():

 getSupportFragmentManager() .beginTransaction() .setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN ) .show( m_topFragment ) .commit() 

Animaciones personalizadas

También puede personalizar la animación utilizando el método setCustomAnimations ():

 getSupportFragmentManager() .beginTransaction() .setCustomAnimations( R.anim.slide_up, 0, 0, R.anim.slide_down) .show( m_topFragment ) .commit() 

slide_up.xml

   

slide_down.xml

   

Múltiples animaciones

Finalmente, también es posible iniciar animaciones de fragmentos múltiples en una sola transacción. Esto permite un efecto bastante genial cuando un fragmento se desliza hacia arriba y el otro se desliza hacia abajo al mismo tiempo:

 getSupportFragmentManager() .beginTransaction() .setCustomAnimations( R.anim.abc_slide_in_top, R.anim.abc_slide_out_top ) // Top Fragment Animation .show( m_topFragment ) .setCustomAnimations( R.anim.abc_slide_in_bottom, R.anim.abc_slide_out_bottom ) // Bottom Fragment Animation .show( m_bottomFragment ) .commit() 

Para más detalles, puede visitar la URL

Nota: – Puede verificar la animación de acuerdo con sus necesidades, ya que las anteriores pueden tener problemas.

Esta es otra solución que uso:

 public class CustomAnimator { private static final String TAG = "com.example.CustomAnimator"; private static Stack 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(); } } 

El uso de la clase. Digamos que tienes dos fragmentos (lista y fragmentos de detalles) como se muestra a continuación

     

Uso

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

Puede usar la función CustomAnimator.reversePrevious(); para obtener la vista previa cuando el usuario presionó hacia atrás.

Tengo el mismo problema, utilicé una solución simple

1) crear sliding_out_right.xml en carpeta anim

       

2) crear sliding_in_left.xml en la carpeta anim

      

3) simplemente usando la transacción de fragmento setCustomeAnimations () con dos xml personalizados y dos xml predeterminados para la animación de la siguiente manera: –

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