300 votes

Animer la transition entre les fragments

Je suis en train d'animer la transition entre les fragments. J'ai eu la réponse de l'suivantes
Android des Fragments et de l'animation

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

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

Mais quand j'ai essayé ce qu'il a montré

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)

Des idées? Quand j'ai vérifié en Nid d'abeille de référence de l'API translate y est. Qu'ai-je manqué?
Est-il un autre moyen pour animer la transition entre les fragments? Merci

358voto

Roman Nurik Points 18632

Vous devez utiliser le nouveau android.animation - cadre (objet animateurs) avec FragmentTransaction.setCustomAnimations ainsi qu'avec d' FragmentTransaction.setTransition.

Voici un exemple sur l'utilisation de l' setCustomAnimations de ApiDemos' FragmentHideShow.java:

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

et voici pertinentes de l'animateur XML à partir d' 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" />

Notez que vous pouvez combiner plusieurs animateurs à l'aide de <set>, tout comme vous pourriez avec l'ancien cadre de l'animation.


EDIT: Depuis que les gens se posent à propos de slide-slide-out, je vais commenter ici.

Faites glisser et coulissant

Bien sûr, vous pouvez animer l' translationX, translationY, x, et y propriétés, mais en général, les diapositives impliquer l'animation du contenu vers et depuis l'extérieur de l'écran. Autant que je sache, il n'y a pas de traduction des propriétés qui utilisent des valeurs relatives. Toutefois, cela ne vous empêche pas de les écrire vous-même. Rappelez-vous que la propriété des animations simplement besoin de getter et setter sur les objets que vous animez (dans ce cas les points de vue), de sorte que vous pouvez simplement créer votre propre getXFraction et setXFraction méthodes sur votre façon de voir la sous-classe, comme ceci:

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

Maintenant, vous pouvez animer le " xFraction biens, comme suit:

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

Notez que si l'objet que vous êtes l'animation n'est pas de la même largeur que son parent, les choses ne se passent pas l'air tout à fait à droite, de sorte que vous devrez peut-être modifier votre propriété mise en œuvre pour l'adapter à votre cas d'utilisation.

47voto

strangeluck Points 466

La réponse de Nurik a été très utile, mais je n'ai pas réussi à le faire fonctionner avant d'avoir trouvé cela . En résumé, si vous utilisez la bibliothèque de compatibilité (par exemple, SupportFragmentManager au lieu de FragmentManager), la syntaxe des fichiers d'animation XML sera différente.

12voto

sherpya Points 2616

Android SDK mise en œuvre de FragmentTransaction veut un Animator alors que la bibliothèque de support veut un Animation , ne me demandez pas pourquoi mais après le commentaire de strangeluk j'ai regardé ad android. Android SDK utilise loadAnimator() et la bibliothèque de support utilise loadAnimation()

1voto

sunshine Points 3779

Je viens de trouver cette bibliothèque d'animation pour la transition enfant de pager view. Vous pouvez utiliser http://nineoldandroids.com/ library pour l'animation

Voici un exemple de viewpager pour cette bibliothèque.

1voto

mark.kedzierski Points 494

J'ai ajouté le support NineOldAndroids à la bibliothèque du support Google. Voir http://www.github.com/kedzie/Support_v4_NineOldAndroids pour plus de détails. Il permet d'utiliser des animations de propriété pour les transitions de fragmentation, PageTransformers et d'autres choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X