Le fragment de transition sur Android glisse vers le haut

J'ai un fragment qui consiste à remplacer un autre fragment. Je veux préciser 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

  • Android ViewFlipper qui suit les gestes immédiatement
  • Couverture de l'animation Android et facilité (animation de livre ouverte)
  • Infinite ObjectAnimator avec interpolateur ... Comment accélérer uniquement le démarrage initial?
  • Animation Le long d'un chemin avec la rotation automatique basée sur le chemin dans Android
  • Android: AnimationDrawable cast error
  • Android Alpha Animation: la valeur Alpha retourne à la valeur ancienne après la fin de l'animation
  •  <?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'essaye vraiment de faire, c'est que le nouveau fragment se glisse en bas. Mes animations sont ignorées. Quel est le code manquant?

    5 Solutions collect form web for “Le fragment de transition sur Android glisse vers le haut”

     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 d'autres personnes qui viennent ici:

    E1da est juste dans la mesure où cet appel setCustomAnimation() doit être appelé avant le replace() . Sinon, l'animation ne s'affiche pas.
    Le deuxième problème est que vous utilisez probablement des fragments indigènes 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 distinguer entre l'animation de la vue pour les fragments de support d'une part et l'animation de la propriété pour les fragments indigènes d'autre part.

    Voir l'animation:
    Est-ce que la manière pré-Android 3.0 est d'animer les vues. Le code d'exemple pour cela est le slide_in.xml et 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 convient de mentionner que vous ne pouvez pas animer des fragments avec une animation de vue. L'exception à cela est des fragments de la bibliothèque de support (android.support.v4.app.Fragment).

    Animation de la propriété
    C'est la façon d'animer les objets après Android 3.0. Il est également déclaré comme .xml mais utilise la balise "valueAnimator" (objectAnimator extends valueAnimator). Les exemples sont dans la réponse à la question. C'est la façon dont les fragments indigènes (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 comme dans getWindowManager().getDefaultDisplay().getMetrics(metrics).xdpi (voir DisplayMetrics ). Mais je n'ai pas développé Android depuis un certain temps, donc 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 après cela dans votre activité ou ensemble d'ensemble 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(); 

    R.anim ne travaillera pas là-bas, mais R.animator le fera. par exemple

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

    Voici un exemple de travail complet

    En appuyant sur le bouton, vous pouvez basculer entre 2 fragments A et B (par animation diapositive droite à gauche). Les fragments ne sont que des textes stupides (AAAAAA et BBBBB) avec des antécédents différents.

    MainActivity.java

     package com.example.slidetrans; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { boolean showingA = true; Button button; A a; B b; private void incarnate(FragmentManager fm){ int layoutId = R.id.frame; boolean fragmentWasNull = false; Fragment f = fm.findFragmentById(layoutId); if (f == null){ if (showingA){ f = a = new A(); } else { f = b = new B(); } fragmentWasNull = true; } if (fragmentWasNull){ FragmentTransaction ft = fm.beginTransaction(); ft.add(layoutId, showingA ? a : b, "main").commit(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager fm = getFragmentManager(); incarnate(fm); button = (Button)findViewById(R.id.button); OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.setCustomAnimations(R.anim.in, R.anim.out); transaction.replace(R.id.frame, showingA ? new B() : new A()).commit(); showingA = !showingA; button.setText(showingA ? "slide in B" : "slide in A"); } }; button.setOnClickListener(listener); } } 

    LL.java

     package com.example.slidetrans; import android.content.Context; import android.util.AttributeSet; import android.widget.LinearLayout; public class LL extends LinearLayout { public LL(Context context) { super(context); } public LL(Context context, AttributeSet attrs) { super(context, attrs); } public float getXFraction() { final int width = getWidth(); if (width != 0) return getX() / getWidth(); else return getX(); } public void setXFraction(float xFraction) { final int width = getWidth(); float newWidth = (width > 0) ? (xFraction * width) : -9999; setX(newWidth); } } 

    Main.xml (mise en page)

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="slide in B" /> <FrameLayout android:id="@+id/frame" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> </LinearLayout> 

    A.xml (mise en page)

     <?xml version="1.0" encoding="utf-8"?> <com.example.slidetrans.LL xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#00FF00" > <TextView android:id="@+id/aText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="AAAAAAAAAAAAAAAAAA" android:textSize="30sp" android:textStyle="bold" /> </com.example.slidetrans.LL> 

    B.xml (mise en page)

     <?xml version="1.0" encoding="utf-8"?> <com.example.slidetrans.LL xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#FFFF00" > <TextView android:id="@+id/bText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:textStyle="bold" android:text="BBBBBBBBBB" /> </com.example.slidetrans.LL> 

    In.xml (anim)

     <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="500" android:interpolator="@android:anim/linear_interpolator" android:propertyName="xFraction" android:valueFrom="1.0" android:valueTo="0.0" android:valueType="floatType" /> </set> 

    Out.xml (anim)

     <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="500" android:interpolator="@android:anim/linear_interpolator" android:propertyName="xFraction" android:valueFrom="0.0" android:valueTo="-1.0" android:valueType="floatType" /> </set> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.