Pregunta

¿Cómo debe implementar el tipo de deslizamiento que, por ejemplo, usa el cliente de HoneyComb Gmail?

Pueden TransactionManager Maneje esto automáticamente agregando y eliminando los fragmentos, es un poco difícil probar esto debido a que el emulador es una presentación de diapositivas :)

¿Fue útil?

Solución

Para animar la transición entre fragmentos, o animar el proceso de mostrar o ocultar un fragmento, usa el Fragment Manager para crear un Fragment Transaction.

Dentro de cada transacción de fragmento, puede especificar en animaciones que se utilizarán para mostrar y ocultar respectivamente (o ambos cuando se usa reemplazo).

El siguiente código muestra cómo reemplazaría un fragmento deslizando un fragmento y deslizando al otro en su lugar.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

Para lograr lo mismo para esconder o mostrar un fragmento, simplemente llamaría ft.show o ft.hide, pasando en el fragmento que desea mostrar u esconderse respectivamente.

Como referencia, las definiciones de animación XML usarían el objectAnimator etiqueta. Un ejemplo de slide_in_left podría verse algo así:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

Otros consejos

Si no tiene que usar la biblioteca de soporte, eche un vistazo a De los romanos responder.

Pero si quieres usar el biblioteca de soporte Tienes que usar el antiguo marco de animación como se describe a continuación.

Después de consultar Reto y ceguera Respuestas He hecho que funcione el siguiente código.

Aparecen los fragmentos deslizándose desde la derecha y deslizándose hacia la izquierda Cuando se presiona la espalda.

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

El orden es importante. Esto significa que debes llamar setCustomAnimations() antes de replace() ¡O la animación no entrará en vigencia!

A continuación, estos archivos deben colocarse dentro del Res/Anim carpeta.

Enter.xml:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

salir.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_exit.xml:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

La duración de las animaciones se puede cambiar a cualquiera de los valores predeterminados como @android:integer/config_shortAnimTime o cualquier otro número.

Tenga en cuenta que si entre los reemplazos de fragmentos se produce un cambio de configuración (por ejemplo, rotación), la acción de retroceso no está animada. Esto es un error documentado Eso todavía existe en el Rev 20 de la Biblioteca de Apoyo.

Le sugiero que use esto en lugar de crear el archivo de animación porque es una solución mucho mejor. Android Studio ya proporciona defecto animation Puede usar sin crear ningún archivo XML nuevo. Los nombres de las animaciones son android.r.anim.slide_in_left y android.r.anim.slide_out_right Y puedes usarlos de la siguiente manera:

FragmentTransaction.SetCustomations (android.R.anim.slide_in_left, android.r.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();              
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

Producción:

enter image description here

Mi modificado biblioteca de soporte admite el uso de ambas animaciones de vista (es decir, <translate>, <rotate>) y animadores de objetos (es decir <objectAnimator>) para transiciones de fragmentos. Se implementa con Nineoldandroids. Consulte mi documentación en GitHub para más detalles.

Resuelvo esto el camino a continuación

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment

En cuanto a mí, necesito la dirección de vista:

en -> deslizar desde la derecha

fuera -> deslizar a la izquierda

Aquí funciona para mí el código:

slide_in_right.xml

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

slide_out_left.xml

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

codigo de transacción:

inline fun FragmentActivity.setContentFragment(
        containerViewId: Int,
        backStack: Boolean = false,
        isAnimate: Boolean = false,
        f: () -> Fragment

): Fragment? {
    val manager = supportFragmentManager
    return f().apply {
        manager.beginTransaction().let {
            if (isAnimate)
                it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)

            if (backStack) {
                it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
            } else {
                it.replace(containerViewId, this, "Fr").commit()
            }
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top