web-dev-qa-db-fra.com

overridePendingTransition pour faire glisser les activités vers l'intérieur et vers l'extérieur en douceur

J'ai du mal à comprendre comment faire glisser des activités vers l'intérieur et vers l'extérieur en appuyant simplement sur un bouton. Ce que je veux, c'est que l'utilisateur appuie sur un bouton, puis que l'écran glisse. La façon dont je le souhaite, c'est que la 1ère activité (celle avec le bouton) glisse vers la gauche tandis que la nouvelle 2e activité glisse vers la droite.

Avec le code ci-dessous, lorsque le bouton est cliqué, la 1ère activité glisse vers la droite quand je veux qu'elle glisse vers la gauche. Ensuite, quand il a fini de glisser, il ne reste plus qu'un écran noir pendant une fraction de seconde, puis la 2e activité apparaît et ne glisse pas.

Ainsi, la 1ère activité glisse dans la mauvaise direction et la prochaine activité apparaît simplement au lieu de glisser. Qu'est-ce que je fais mal? J'ai du mal à comprendre les fichiers XML, alors écoutez est le code pour tout ce qui suit.

1ère activité

@Override
public void onCreate(Bundle savedInstanceState) {

    playBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MainMenu.this, Levels.class);
            startActivity(intent);
            overridePendingTransition(R.anim.enter_from_right, R.anim.exit_out_left);
        }
    });

2ème activité

@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.levels);

    overridePendingTransition(R.anim.enter_from_left, R.anim.exit_out_right);

Je pense donc que certains de mes fichiers XML peuvent être incorrects. Les voici.

enter_from_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="100%"
        Android:toXDelta="0%" >
    </translate>
</set>

enter_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="-100%"
        Android:toXDelta="0%" >
    </translate>
</set>

exit_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="0%"
        Android:toXDelta="-100%" >
    </translate>
</set>

exit_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set 
    xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <translate
        Android:duration="600"
        Android:fromXDelta="0%"
        Android:toXDelta="100%" >
    </translate>
</set>

EDIT La suppression de la overridePendingTransition() de la 2ème activité a fait en sorte que la 1ère activité glisse vers la gauche, ce que je voulais. Mais, lorsque la 1ère activité s'éloigne, il ne fait que révéler un écran noir au lieu de faire glisser la 2ème activité depuis la droite.

19
Matt

Au lieu de remplacer l'animation à la fois dans startActivity() et dans les nouvelles activités onCreate(), il vous suffit de remplacer l'animation juste après l'appel startActivity().

Les deux int que vous fournissez pour overridePendingTransition(int enterAnim, int exitAnim) correspondent aux deux animations - en supprimant l'ancien Activity et en ajoutant la nouvelle.

Pour votre deuxième question, je pense que le paramètre fromXDelta est incorrect, -100% devrait être complètement éloigné du côté à gauche de l'écran, pas à droite, donc le changer à 100% devrait répare le.

19
panini

regardez mon Gist, cela fonctionne parfaitement:

1. remplacer le début et la fin de CommonActivity

 @Override
    public void startActivity(Intent intent) {
        super.startActivity(intent);
        overridePendingTransition(R.anim.from_right_in, R.anim.from_left_out);
    }

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.from_left_in, R.anim.from_right_out);
    }

2.from_left_in.xml

    <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="-100%p"
               Android:toXDelta="0"
               Android:duration="300"/>
    <alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
   </set>

3.from_right_in.xml

   <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="100%p"
               Android:toXDelta="0"              Android:interpolator="@Android:interpolator/accelerate_decelerate"
               Android:duration="300"/>
    <alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>

4.from_left_out.xml

   <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0"
               Android:toXDelta="-100%p"
               Android:duration="300"/>
    <alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>

5.from_right_out.xml

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0"
               Android:toXDelta="100%p"
               Android:duration="300"/>
    <alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>

Lien Gist: https://Gist.github.com/JagieChen/f5cc44bf663f3722bd19097be47ccf9b

7
Jagie

Il y a une erreur non seulement dans l'animation enter_from_right, qui devrait avoir un fromXDelta de 100% au lieu de -100%, mais même dans l'animation enter_from_left, qui devrait avoir un fromXDelta de -100% au lieu de 100%.

À votre santé,

1
mircobabini

Remplacez fromXDelta par -100% de enter_from_left et fromXDelta à 100% de enter_from_right dans votre code, cela vous donnera une animation glissante correcte.

0
syedjibharat