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.
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.
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
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é,
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.