Je travaille sur une application de démonstration où je souhaite appliquer une animation à chaque application qui commence activity
. J'ai écrit ci-dessous le code mais c'est pour animer l'activité de gauche à droite.
left_to_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate Android:fromXDelta="-100%" Android:toXDelta="0%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="500"/>
</set>
right_to_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:duration="500"
Android:fromXDelta="0%"
Android:fromYDelta="0%"
Android:toXDelta="100%"
Android:toYDelta="0%" />
</set>
Je commence ici une activity
comme ceci
startActivity(new Intent(this, LoginActivity.class));
overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
Je veux réaliser une animation de droite à gauche. Comment cela peut être fait.
Merci d'avance.
Faites ces modifications à vos fichiers d'animation:
enter.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:duration="500"
Android:fromXDelta="100%"
Android:fromYDelta="0%"
Android:toXDelta="0%"
Android:toYDelta="0%" />
</set>
exit.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:duration="500"
Android:fromXDelta="0%"
Android:fromYDelta="0%"
Android:toXDelta="-100%"
Android:toYDelta="0%" />
</set>
Votre deuxième activité glisse de droite à gauche.
Pour mieux comprendre comment utiliser les valeurs fromXDelta et toXDelta pour les animations, voici une illustration très basique des valeurs:
De cette façon, vous pouvez facilement comprendre pourquoi vous ajoutez Android: fromXDelta = "0%" et Android: toXDelta = "- 100%" pour votre activité actuelle. Et c’est parce que vous voulez qu’il passe de 0% à -100%.
[MODIFIER]
Donc, si vous voulez ouvrir ActivityB à partir de ActivityA, procédez comme suit (supposons que vous ayez un bouton):
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(ActivityA.this, ActivityB.class));
overridePendingTransition(R.anim.enter, R.anim.exit);
}
});
Maintenant, si vous voulez avoir l'animation "en arrière" de la première, lorsque vous quittez l'activité B, vous aurez besoin de 2 nouveaux fichiers d'animation et du code dans la méthode onBackPressed de ActivityB, comme ceci:
D'abord les fichiers d'animation: Left_to_right.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:duration="500"
Android:fromXDelta="-100%"
Android:fromYDelta="0%"
Android:toXDelta="0%"
Android:toYDelta="0%" />
</set>
right_to_left.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:duration="500"
Android:fromXDelta="0%"
Android:fromYDelta="0%"
Android:toXDelta="100%"
Android:toYDelta="0%" />
</set>
Et dans ActivityB, procédez comme suit:
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
}
De plus, si vous avez activé la navigation ascendante, vous devrez également ajouter l'animation:
Vous activez la navigation UP comme ceci:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
Et voici comment vous gérez l'animation dans ce cas également:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case Android.R.id.home:
//NavUtils.navigateUpFromSameTask(this);
finish();
overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
return true;
}
return super.onOptionsItemSelected(item);
}
Sachez également que même si votre code est correct, les animations peuvent être désactivées sur votre téléphone. Pour allumer, procédez comme suit:
Est-ce que cela aide?
overridePendingTransition
devrait être appelé dans l'activité "cible". Par exemple: à partir de l'activité A -> B, vous placeriez l'appel overridePendingTransition
dans la onCreate
de l'activité B.
N'oubliez pas que si l'utilisateur a désactivé l'animation au niveau du système, vous ne pouvez pas forcer l'affichage des animations.
MODIFIER:
Un exemple ressemblerait à ceci:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.enter, R.anim.exit);
}
Essayez ce code, ça marche pour moi
Pour glisser de droite à gauche
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fillAfter="true" >
<translate
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="500"
Android:fromXDelta="0%"
Android:toXDelta="-50%" >
</translate>
</set>
Pour glisser de gauche à droite
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="500"
Android:fromXDelta="-50%"
Android:toXDelta="0%" >
</translate>
C'est le code parfait pour moi Slideinleft
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromXDelta="100%p"
Android:toXDelta="0"
Android:duration="800"/>
Slideinright
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromXDelta="0"
Android:toXDelta="-100%p"
Android:duration="800"/>
En activité
Intent intent = new Intent(getApplicationContext(),termcondionactivity.class);
Bundle bndlAnimation = ActivityOptions.makeCustomAnimation(getApplicationContext(), R.anim.slideinleft, R.anim.slideinright).toBundle();
startActivity(intent, bndlAnimation);