overridependingtransition fragments example entre animations animaciones android animation android-fragments

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



overridependingtransition fragment (4)

Esta es otra solución que uso:

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

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

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

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.

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 alcance. ¿Cómo puedo hacerlo?


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

<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="translationY" android:valueType="floatType" android:valueFrom="1280" android:valueTo="0" android:duration="@android:integer/config_mediumAnimTime"/>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="translationY" android:valueType="floatType" android:valueFrom="0" android:valueTo="1280" android:duration="@android:integer/config_mediumAnimTime"/>

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.


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

1) crear sliding_out_right.xml en carpeta anim

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-50%p" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@android:integer/config_mediumAnimTime" /> </set>

2) crear sliding_in_left.xml en la carpeta anim

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="50%p" android:toXDelta="0" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_mediumAnimTime" /> </set>

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


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

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

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