J'écris une application Android où je veux que l'activité apparaisse en animant du bas de l'écran vers le haut. Je peux le faire avec du code d'ici:
Cependant, je ne suis pas en mesure de faire l'animation vice-versa dans laquelle l'activité disparaîtrait en glissant du haut vers le bas de l'écran.
J'ai utilisé le code dans le lien ci-dessus; l'activité apparaît en glissant vers le haut, mais lorsqu'elle disparaît, elle s'estompe au lieu de glisser vers le bas.
J'ai même essayé de mettre le code dans onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
overridePendingTransition(R.anim.appear_from_bottom, R.anim.disappear_to_bottom);
setContentView(R.layout.activity_all_metadata_display);
initializePage();
}
Vous devez définir vos animations "glisser vers le haut" à partir de la question liée, et de nouvelles animations "glisser vers le bas" qui inversent le processus.
Les parties importantes des animations à regarder sont les valeurs fromYDelta
et toYDelta
. Ceux-ci définissent les positions Y (en haut de votre vue) au début et à la fin des animations.
slide_in_up.xml
<?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
<?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_in_down.xml
<?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_down.xml
<?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" />
Pour les animations "glisser vers le haut", vous devriez avoir remplacé la transition en attente dans votre méthode onResume()
comme ceci:
protected void onResume()
{
super.onResume();
overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up);
}
Pour les animations "glisser vers le bas", faites quelque chose de similaire dans votre méthode onPause()
:
protected void onPause()
{
super.onPause();
overridePendingTransition(R.anim.slide_in_down, R.anim.slide_out_down);
}
Certains didacticiels suggèrent d'utiliser les mauvaises méthodes de cycle de vie:
onCreate()
n'est pas appelée à chaque fois que l'activité est affichéeonDestroy()
n'est pas appelée à chaque fois que l'activité est suppriméeUtilisez plutôt des méthodes appelées à chaque transition d'écran:
onResume()
est appelée lorsque l'activité est montrée à l'utilisateuronPause()
est appelée lorsque l'activité va être suppriméePour plus d'informations sur ces méthodes en particulier, consultez le Android:
Lorsque votre écran est affiché, il glissera par le bas.
Lorsqu'un nouvel écran s'affiche, votre écran glisse vers le bas.
Deux façons de procéder:
1. Utilisation de styles
En supposant que vous souhaitiez l'implémenter pour toutes les activités, définissez l'entrée suivante dans votre thème de base:
<item name="Android:windowAnimationStyle">@style/ActivityAnimations</item>
Définissez ensuite le style suivant:
<style name="ActivityAnimations" parent="Android:style/Animation.Activity">
<item name="Android:activityOpenEnterAnimation">@anim/appear_from_bottom</item>
<item name="Android:activityOpenExitAnimation">@anim/hold</item>
<item name="Android:activityCloseEnterAnimation">@anim/hold</item>
<item name="Android:activityCloseExitAnimation">@anim/disappear_to_bottom</item>
</style>
Où @anim/hold
peut être quelque chose comme ceci:
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false" >
<translate
Android:duration="1000"
Android:zAdjustment="bottom" />
</set>
2. Utilisation de overridePendingTransition ()
Remplacer la finition ():
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.hold, R.anim.disappear_to_bottom);
}
Remplacer onBackPressed ():
@Override
public void onBackPressed() {
finish();
}
Remplacez onOptionsItemSelected ():
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Dans votre fichier xml principal. Ajoutez l'identifiant de la balise racine et transmettez-le à la fonction. comme
/** The Constant ANIM_NO. */
public static final int ANIM_NO = 0;
public static void topToDown(Context context, View target, int type,
int duration) {
if (type == UtilityAnimations.ANIM_NO) {
UtilityAnimations.topToDown(context, target, duration);
} else {
final Animation animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
animation.setDuration(duration != 0 ? duration
: UtilityAnimations.DURATION_MEDIAM);
animation.setInterpolator(UtilityAnimations.getInterpolator(
context, type));
target.startAnimation(animation);
}
}
vous pouvez vice-versa votre transition en remplaçant la transition dans votre onPause ():
@Override
protected void onPause()
{
super.onPause();
overridePendingTransition(R.anim.appear_from_bottom, R.anim.disappear_to_bottom);
}