J'essaie d'animer la transition entre les fragments. J'ai obtenu la réponse des fragments et de l'animation Android suivants
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é cela 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? Lorsque j'ai vérifié la référence API Honeycomb translate
est là. Qu'est-ce que j'ai raté?
Existe-t-il un autre moyen d'animer la transition entre les fragments? Je vous remercie
android
android-3.0-honeycomb
Labeeb Panampullan
la source
la source
Réponses:
Vous devez utiliser le nouveau
android.animation
framework (animateurs d'objets) avecFragmentTransaction.setCustomAnimations
ainsi queFragmentTransaction.setTransition
.Voici un exemple d'utilisation
setCustomAnimations
de FragmentHideShow.java d'ApiDemos :et voici le XML d'animateur pertinent de res / animator / fade_in.xml :
Notez que vous pouvez combiner plusieurs animateurs en utilisant
<set>
, tout comme vous le pouviez avec l'ancien framework d'animation.EDIT : Étant donné que les gens posent des questions sur les entrées / sorties, je vais en parler ici.
Slide-in et slide-out
Vous pouvez d'animer les cours
translationX
,translationY
,x
et lesy
propriétés, mais généralement diapositives impliquent l' animation du contenu depuis et hors écran. Pour autant que je sache, il n'y a pas de propriétés de transition qui utilisent des valeurs relatives. Cependant, cela ne vous empêche pas de les écrire vous-même. N'oubliez pas que les animations de propriétés nécessitent simplement des méthodes getter et setter sur les objets que vous animez (dans ce cas, les vues), vous pouvez donc simplement créer vos propres méthodesgetXFraction
etsetXFraction
méthodes sur votre sous-classe de vue, comme ceci:Vous pouvez maintenant animer la propriété 'xFraction', comme ceci:
res / animator / slide_in.xml :
Notez que si l'objet dans lequel vous animez n'est pas de la même largeur que son parent, les choses ne sembleront pas tout à fait correctes, vous devrez donc peut-être modifier votre implémentation de propriété en fonction de votre cas d'utilisation.
la source
J'ai fait comme ça:
Ajoutez cette méthode pour remplacer des fragments par des animations :
Vous devez ajouter quatre animations dans le dossier anim qui est associé à la ressource :
enter_from_left.xml :
exit_to_right.xml :
enter_from_right.xml :
exit_to_left.xml :
Production:
C'est fait .
la source
.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
Si vous pouvez vous permettre de vous attacher uniquement à Lollipop et plus tard, cela semble faire l'affaire:
J'espère que cela t'aides.
la source
new Slide(...)
: l'appel nécessite le niveau 21 de l'APILa réponse de Nurik a été très utile, mais je n'ai pas pu le faire fonctionner jusqu'à ce que je trouve cela . En bref, 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.
la source
Voici une animation de diapositive d'entrée / sortie entre les fragments:
Nous utilisons un objectAnimator.
Voici les deux fichiers xml du sous-dossier de l' animateur .
enter_anim.xml
exit_anim.xml
J'espère que cela aiderait quelqu'un.
la source
.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right)
Pour toute autre personne interceptée, assurez-vous que setCustomAnimations est appelé avant l'appel pour remplacer / ajouter lors de la génération de la transaction.
la source
La mise en œuvre du SDK Android de FragmentTransaction veut un
Animator
certain temps, la bibliothèque de support en veut unAnimation
, ne me demandez pas pourquoi, mais après le commentaire de strangeluk, j'ai examiné le code Android 4.0.3 et la bibliothèque de support. Utilisations du SDK AndroidloadAnimator()
et utilisations de la bibliothèque de supportloadAnimation()
la source
Essayez d'utiliser cette solution simple et rapide. Android fournit certains
animation
s par défaut .Production:
la source