82 votes

Comment animer une vue dans Android et la faire rester dans la nouvelle position/taille?

Actuellement, j'ai une vue dans mon application Android et cette vue affiche une animation d'image par image. Je veux animer la vue pour augmenter sa taille de 150%. Lorsque j'applique une animation d'échelle à celle-ci, et que l'animation d'échelle est terminée, je veux que la vue reste à cette nouvelle taille pour le reste du cycle de vie de l'activité. Malheureusement, actuellement, lorsque l'animation de grossissement est terminée, la vue revient instantanément à sa taille d'origine. Comment puis-je faire pour conserver cette nouvelle transformation animée ?

Je utilise

myView.startAnimation(AnimationUtils.loadAnimation(mContext,R.anim.scaleUp150));

Merci !

149voto

Qlimax Points 1965

Assurez-vous d'ajouter les attributs ci-dessous à l'élément racine dans votre animation xml:

android:fillAfter="true" 
android:fillEnabled="true"

7 votes

Voici la vraie réponse. L'OP devrait changer cela pour être la réponse acceptée. Merci Qlimax !! (P.S. cela n'est pas documenté dans la section "Animation" du guide Dev, c'est seulement documenté dans les javadocs de la classe Animation. Une telle mauvaise documentation!)

7 votes

Où mettre ce code? dans ou dans les balises d'animation (translate|rotate|scale)?

5 votes

Comme indiqué ci-dessous, vous devez l'ajouter au paramètre de l'ensemble

53voto

Mina Samy Points 3207

Essayez de construire l'animation à partir du code et de définir les propriétés comme ceci

anim.setFillEnabled(true);
anim.setFillAfter(true);

0 votes

Mais cela crée un nouveau problème, je reçois un événement tactile dessus.stackoverflow.com/questions/4728908/…

32voto

cV2 Points 2073

Si vous voulez mettre votre animation dans un fichier xml, cela peut-être nécessaire pour vous aider :

https://stackoverflow.com/a/6519233/371749

veuillez également apprécier l'autre réponse, m'a aidé :) bonne chance!

2voto

Walter Mundt Points 9160

EDIT : La réponse de Qlimax est meilleure, mais comme l'OP n'est pas revenu pour changer la coche et que je ne peux pas supprimer une réponse acceptée, je vais la copier ici : il suffit de définir fillAfter=true fillEnabled=true

Ma réponse initiale (qui fonctionne, mais qui est légèrement ridicule en comparaison) suit :

Pour que les choses fonctionnent comme prévu après l'animation, du moins selon ce fil, vous devrez écrire un gestionnaire onAnimationEnd et, à l'intérieur, ajuster manuellement les limites "réelles" (pré-transformation) de votre vue pour correspondre au résultat final de l'animation de mise à l'échelle.

0 votes

Salut Walter. J'ai remplacé onAnimationEnd, mais je ne sais pas comment ajuster les limites "réelles" de la vue pour correspondre à l'échelle de l'animation. Je sais exactement en dp où je veux qu'il se termine, mais je ne trouve pas la fonction "setWidth()" ou "setHeight()".

1 votes

Je crois que ces informations sont stockées dans les LayoutParams. Vous devriez pouvoir faire view.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();. (L'appel suivant est nécessaire pour informer l'arborescence des vues qu'elle doit être recalculée.)

2 votes

Ceci est une façon incroyablement détournée de faire les choses. Tout ce que l'on a besoin de faire est de définir les attributs android:fillEnabled et android:fillAfter pour qu'ils soient tous les deux vrais.

1voto

Sephy Points 18893

En réalité, comme l'animation que vous utilisez semble être intégrée dans le framework Android, je ne suis pas sûr que vous puissiez y changer quoi que ce soit.
Cependant, vous pouvez créer votre propre animation en suivant l'exemple dans la documentation. Et vous devrez ajouter android:fillAfter="true" si vous voulez que l'animation de mise à l'échelle soit conservée après la fin de l'animation.

2 votes

ScaleUp150 est une animation personnalisée que j'ai écrite en xml (bien que ce soit extrêmement basique). J'ai ajouté android:fillAfter="true" à l'intérieur de l'animation mais elle revient toujours à sa taille d'origine :S

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X