102 votes

Animation de mise à l'échelle de l'image Android par rapport au point central

J'ai un ImageView et je lui applique une animation simple de mise à l'échelle. Code très standard.

Mon scale_up.xml:

Mon code d'animation:

Animation a = AnimationUtils.loadAnimation(this, R.anim.scale_up);
((ImageView) findViewById(R.id.circle_image)).startAnimation(a);

Le problème:

Lorsque l'image est mise à l'échelle, elle ne se met pas à l'échelle à partir du centre, mais à partir du coin supérieur gauche. En d'autres termes, la version mise à l'échelle de l'image n'a pas le même point que le centre, mais elle a le même point supérieur gauche. Voici une image qui explique ce que je veux dire:

Comment l'animation se met à l'échelle Comment je veux que ça soit

La première image montre comment l'animation se met à l'échelle et la deuxième image montre comment je veux que ça se mette à l'échelle. Elle devrait conserver le même point central. J'ai essayé de définir la gravité sur l'image, sur le conteneur, d'aligner à gauche ou à droite, mais ça se met toujours à l'échelle de la même manière.

Je suis en train d'utiliser RelativeLayout pour l'écran principal et ImageView est situé dans un autre RelativeLayout, mais j'ai essayé d'autres mises en page, sans changement.

175voto

Jiang Qi Points 1054

50% est le centre de la vue animée.

50%p est le centre du parent

129voto

Rohan Kandwal Points 2002

La réponse fournie par @stevanveltema et @JiangQi est parfaite mais si vous souhaitez mettre à l'échelle en utilisant du code, vous pouvez utiliser ma réponse.

// d'abord, 0f, 1f signifie mise à l'échelle de l'axe des X à l'axe des X, c'est-à-dire de 0-100%
// d'abord, 0f, 1f signifie mise à l'échelle de l'axe des Y à l'axe des Y, c'est-à-dire de 0-100%
// Les deux 0.5f signifient que l'animation commencera à 50% de l'axe X et 50% de l'axe Y, c'est-à-dire du centre

ScaleAnimation fade_in =  new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(1000);     // durée de l'animation en millisecondes
fade_in.setFillAfter(true);    // Si fillAfter est vrai, la transformation effectuée par cette animation persistera une fois terminée.
view.startAnimation(fade_in);

78voto

Steven Veltema Points 1238

Oubliez la traduction supplémentaire, définissez android:pivotX, android:pivotY à la moitié de la largeur et de la hauteur et il se mettra à l'échelle depuis le centre de l'image.

7voto

Aldryd Points 706

Vous pouvez utiliser l'animation de translation dans votre ensemble pour corriger cela. Vous devrez probablement ajuster les valeurs de toXDelta et toYDelta pour que l'image reste centrée.

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