visuales transiciones transicion studio para pantallas navegacion fragments entre efectos diseño developer botones animaciones activities android android-3.0-honeycomb

studio - transiciones android developer



Animar la transición entre fragmentos. (8)

Aquí hay una animación de diapositivas de entrada / salida entre fragmentos:

FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim); transaction.replace(R.id.listFragment, new YourFragment()); transaction.commit();

Estamos utilizando un objectAnimator.

Aquí están los dos archivos XML en la subcarpeta animador .

enter_anim.xml

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

exit_anim.xml

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

Espero que eso ayude a alguien.

Estoy tratando de animar la transición entre fragmentos. Tengo la respuesta de la siguiente
Fragmentos de Android y animación.

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

Y mi R.anim.slide_in_left

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

Pero cuando probé esto se mostró

02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.BackStackRecord.run(BackStackRecord.java:578) 02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)

¿Algunas ideas? Cuando verifiqué la translate referencia de la API Honeycomb está ahí. ¿Qué me perdí?
¿Hay alguna otra manera de animar la transición entre fragmentos? Gracias


Debe utilizar el nuevo marco de android.animation (animadores de objetos) con FragmentTransaction.setCustomAnimations así como FragmentTransaction.setTransition .

Aquí hay un ejemplo sobre el uso de setCustomAnimations del FragmentHideShow.java de ApiDemos:

ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

y aquí está el XML animador relevante de res / animator / fade_in.xml :

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:interpolator/accelerate_quad" android:valueFrom="0" android:valueTo="1" android:propertyName="alpha" android:duration="@android:integer/config_mediumAnimTime" />

Tenga en cuenta que puede combinar varios animadores usando <set> , tal como pudo con el marco de animación más antiguo.

EDITAR : Ya que la gente pregunta acerca de la entrada / salida de diapositivas, comentaré eso aquí.

Deslizarse y deslizarse

Por supuesto, puede animar las propiedades de translationY x , translationY , x e y , pero en general las diapositivas implican animar contenido desde y hacia la pantalla. Por lo que sé, no hay propiedades de transición que utilicen valores relativos. Sin embargo, esto no te impide escribirlas tú mismo. Recuerde que las animaciones de propiedades simplemente requieren métodos getter y setter en los objetos que está animando (en este caso vistas), por lo que puede crear sus propios métodos getXFraction y setXFraction en su subclase de vista, como esto:

public class MyFrameLayout extends FrameLayout { ... public float getXFraction() { return getX() / getWidth(); // TODO: guard divide-by-zero } public void setXFraction(float xFraction) { // TODO: cache width final int width = getWidth(); setX((width > 0) ? (xFraction * width) : -9999); } ... }

Ahora puedes animar la propiedad ''xFraction'', como esta:

res / animator / slide_in.xml :

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator" android:valueFrom="-1.0" android:valueTo="0" android:propertyName="xFraction" android:duration="@android:integer/config_mediumAnimTime" />

Tenga en cuenta que si el objeto en el que está animando no tiene el mismo ancho que su padre, las cosas no se verán bien, por lo que es posible que deba modificar la implementación de su propiedad para que se adapte a su caso de uso.


He hecho de esta manera:

Agregue este método para reemplazar fragmentos con animaciones :

public void replaceFragmentWithAnimation(android.support.v4.app.Fragment fragment, String tag){ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left); transaction.replace(R.id.fragment_container, fragment); transaction.addToBackStack(tag); transaction.commit(); }

Tienes que agregar cuatro animaciones en la carpeta anim que está asociada con el recurso :

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>

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>

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>

Salida:

Está Hecho .


Intenta usar esta solución simple y en ayunas. Android proporciona algunas animation defecto.

fragmentTransaction.setCustomAnimations(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();

Salida:


La implementación de FragmentTransaction de Android SDK quiere un Animator mientras que la biblioteca de soporte quiere una Animation , no me preguntes por qué, pero después del comentario de strangeluk, busqué en el código de Android 4.0.3 y en la biblioteca de soporte. Android SDK usa loadAnimator() y la biblioteca de soporte usa loadAnimation()


La respuesta de Nurik fue muy útil, pero no pude hacerlo funcionar hasta que encontré this . En resumen, si está utilizando la biblioteca de compatibilidad (por ejemplo, SupportFragmentManager en lugar de FragmentManager), la sintaxis de los archivos de animación XML será diferente.


Para cualquier otra persona que sea atrapada, asegúrese de que se llame a setCustomAnimations antes de la llamada para reemplazar / agregar cuando se genere la transacción.


Si puedes permitirte unirte solo con Lollipop y más tarde, esto parece hacer el truco:

import android.transition.Slide; import android.util.Log; import android.view.Gravity; . . . f = new MyFragment(); f.setEnterTransition(new Slide(Gravity.RIGHT)); f.setExitTransition(new Slide(Gravity.LEFT)); getFragmentManager() .beginTransaction() .replace(R.id.content, f, FRAG_TAG) // FRAG_TAG is the tag for your fragment .commit();

Espero que esto ayude.