J'ai un fragment qui doit remplacer un autre fragment. Je veux spécifier l'animation. Mais l'animation est ignorée.
transaction.replace(R.id.my_fragment, newFrag);
transaction.addToBackStack(null);
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);
slide_in_up
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromYDelta="0%p"
Android:toYDelta="100%p" />
slide_out_up
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromYDelta="100%p"
Android:toYDelta="0%p" />
Tout ce que j'essaie vraiment de faire, c'est que le nouveau fragment glisse à partir du bas. Mes animations sont ignorées. Quel est le code manquant?
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);
transaction.addToBackStack(null);
transaction.replace(R.id.my_fragment, newFrag);
slide_in_up
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromYDelta="100%p"
Android:toYDelta="0%p" />
slide_out_up
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromYDelta="0%p"
Android:toYDelta="-100%p" />
Cela fait un certain temps que cette question a été posée, mais voici une réponse pour les autres personnes venant ici:
e1da a raison dans la mesure où cet appel setCustomAnimation()
doit être appelé avant replace()
. Sinon, l'animation ne sera pas affichée.
Le deuxième problème est que vous utilisez probablement des fragments natifs qui ne peuvent pas être animés avec les animations de vue.
Utilisez les fichiers suivants:
slide_in_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<objectAnimator
Android:duration="500"
Android:propertyName="y"
Android:valueFrom="1280"
Android:valueTo="0"
Android:valueType="floatType" />
</set>
slide_out_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<objectAnimator
Android:duration="500"
Android:propertyName="y"
Android:valueFrom="0"
Android:valueTo="-1280"
Android:valueType="floatType" />
</set>
Une petite explication:
Vous devez différencier l’animation de vue pour les fragments de support d’une part et l’animation de propriété des fragments natifs de l’autre.
Voir l'animation:
Est le moyen d’animer des vues d’avant Android 3.0. Exemple de code pour cela est le slide_in.xml
et le slide_up.xml
par user3093402
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromYDelta="0%p"
Android:toYDelta="100%p" />
Il est à noter que vous ne pouvez pas animer de fragments avec une animation de vue. Les exceptions à cette règle sont des fragments de la bibliothèque de support (Android.support.v4.app.Fragment).
Animation de la propriété
C'est le moyen d'animer des objets après Android 3.0. Il est également déclaré en tant que fichier .xml, mais utilise la balise "valueAnimator" (objectAnimator étend valueAnimator). Vous trouverez des exemples dans la réponse à la question ..__ C'est la façon dont les fragments natifs (Android.app.Fragment) peuvent être animés.
Voir également:
J'espère que cela t'aides,
Kai
EDIT: Comme l'a souligné Raphael Royer-Rivard, la taille d'écran fixe est une mauvaise pratique. Il serait préférable d'utiliser une constante du système d'exploitation telle que dans getWindowManager().getDefaultDisplay().getMetrics(metrics).xdpi
(Voir DisplayMetrics ). Mais comme je n’ai pas fait de développement Android depuis un certain temps, je ne sais pas lequel.
code pour slide_in_up:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_mediumAnimTime"
Android:fromYDelta="100%p"
Android:toYDelta="0%p" />
</set>
code pour slide_in_down:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_mediumAnimTime"
Android:fromYDelta="0%p"
Android:toYDelta="100%p" />
</set>
code pour slide_out_up:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate
Android:duration="@Android:integer/config_mediumAnimTime"
Android:fromXDelta="0"
Android:toYDelta="100%" />
</set>
code pour slide_out_down:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate
Android:duration="@Android:integer/config_mediumAnimTime"
Android:fromXDelta="0"
Android:toYDelta="-100%" />
</set>
et ensuite dans votre activité ou votre animation de groupe de fragments comme ci-dessous:
Fragment fragment = new Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_in_down, R.anim.slide_out_down, R.anim.slide_out_up);
transaction.replace(container, fragment).commit();
Actuellement avec Android.transition
ceci est aussi simple que fragment.enterTransition = Slide()
ou fragment.enterTransition = Fade()
Note: Min version L.
R.anim n'y travaillera pas mais R.animator le fera . Par exemple
transaction.setCustomAnimations(Android.R.animator.fade_in, Android.R.animator.fade_out);