web-dev-qa-db-fra.com

Rendez l'activité animée de haut en bas

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();
}
26
user2903200

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ée
  • onDestroy() n'est pas appelée à chaque fois que l'activité est supprimée

Utilisez plutôt des méthodes appelées à chaque transition d'écran:

  • onResume() est appelée lorsque l'activité est montrée à l'utilisateur
  • onPause() est appelée lorsque l'activité va être supprimée

Pour 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.

77

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>

@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);
  }
7
nyx

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);
    }
}
4
Usman Afzal

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);

}
1
Arash GM