Comment fournir une animation lors de l'appel d'une autre activité sous Android?

115

J'ai deux activités A et B. Je veux avoir l'animation réduite lorsque l'activité A appelle B et maximiser l'animation lorsque l'activité B appelle A. Je n'ai pas besoin des fichiers xml d'animation pour cela.

Lorsque nous appelons une autre activité dans Android, elle donne son animation par défaut, puis elle appelle une animation de réduction.

Ce que je veux, c'est que l'animation par défaut ne se produise pas et que l'animation que je souhaite se produise.

Pouvons-nous réellement donner l'animation lors de l'appel d'une autre activité?

sunil
la source

Réponses:

144

Depuis l'API 16, vous pouvez fournir un ensemble d'options d'activité lors de l'appel de Context.startActivity (Intent, Bundle) ou des méthodes associées. Il est créé via le générateur ActivityOptions :

Intent myIntent = new Intent(context, MyActivity.class);
ActivityOptions options = 
   ActivityOptions.makeCustomAnimation(context, R.anim.fade_in, R.anim.fade_out);
context.startActivity(myIntent, options.toBundle());

N'oubliez pas de consulter les autres méthodes du générateur ActivityOptions et ActivityOptionsCompat si vous utilisez la bibliothèque de support.



API 5+:

Pour les applications ciblant le niveau d'API 5+, il existe la overridePendingTransitionméthode Activités . Il faut deux ID de ressource pour les animations entrantes et sortantes. Un identifiant de 0désactivera les animations. Appelez-le immédiatement après l' startActivityappel.

c'est à dire:

startActivity(new Intent(this, MyActivity.class));
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

API 3+:

Vous pouvez empêcher l'animation par défaut (glisser depuis la droite) avec l' Intent.FLAG_ACTIVITY_NO_ANIMATIONindicateur dans votre intention.

c'est à dire:

Intent myIntent = new Intent(context, MyActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(myIntent);

puis dans votre activité vous devez simplement spécifier votre propre animation.

Cela fonctionne également pour l'API 1.5 (niveau 3).

whlk
la source
4
Que voulez-vous dire quand vous dites "spécifiez votre propre animation"? Comment est-ce que tu fais ça? Merci!
pqn
J'ai la même question. Probablement dans l'animation de démarrage dans onResume et onPause.
Tima
existe-t-il un moyen d'utiliser Animator à la place?
développeur android
Vous pouvez également utiliser la même chose après avoir appelé finish ()!
thiagolr
N'est-ce pas R.anim.fade_intoujours une animation de fichier xml que nous supposons avoir res\anim ?
Alex Jolig
78

Vous devez utiliser la méthode OverridePendingTransition pour y parvenir, qui se trouve dans la classe Activity . Exemples d'animations dans le dossier res / anim de l'exemple apidemos. Vérifie ça. Plus que de vérifier la démo dans ApiDemos / App / Activity / animation .

Exemple:

@Override
public void onResume(){
    // TODO LC: preliminary support for views transitions
    this.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}
Praveen
la source
1
Merci pour la réponse. La méthode overridePendingTransition est prise en charge à partir du niveau d'API 5 et je souhaite que l'application soit prise en charge à partir d'Android 1.5. Existe-t-il un autre moyen de fournir une animation d'une activité à une autre?
dim
5
impressionnant! c'est très amusant de jouer avec
Someone Somewhere
@sunil j'ai la même question que la vôtre.Pouvez-vous résoudre le problème? animation avec api niveau 3 ou 4 (pas 5)
Dr.jacky
conserver le code d'animation dans onResume () entraînera la lecture de l'animation lorsque l'utilisateur sortira de l'application et reviendra. Pas idéal dans de nombreuses applications.
Vihaan Verma
J'avais besoin d'ajouter super.onResume();, obtenais
Gene Bo
3

Jelly Bean ajoute une prise en charge pour cela avec la méthode ActivityOptions.makeCustomAnimation () . Bien sûr, comme ce n'est que sur Jelly Bean, cela ne vaut pratiquement rien pour des raisons pratiques.

phreakhead
la source
5
Ce n'est plus sans valeur :)
Greg Ennis
À utiliser ActivityOptionsCompatsi vous ciblez le pré-JellyBean.
Thuy Trinh