J'ai un ImageView et j'y fais une animation à l'échelle simple. Code très standard.
Mon scale_up.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:fromXScale="1"
android:fromYScale="1"
android:toXScale="1.2"
android:toYScale="1.2"
android:duration="175"/>
</set>
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 n'est pas mise à 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 en haut à gauche. Voici un lien qui explique ce que je veux dire. La première image est la façon dont l'animation est mise à l'échelle et la deuxième image est la façon dont je veux qu'elle soit mise à l'échelle. Il devrait garder le même point central. J'ai essayé de mettre en place la gravité sur l'image, sur le conteneur, en alignant à gauche ou à droite, elle est toujours à l'échelle. J'utilise RelativeLayout pour l'écran principal et ImageView est situé dans un autre RelativeLayout, mais j'ai essayé d'autres mises en page, aucun changement.
la source
pivotX
etpivotY
devrait être réglé à la moitié deviewportWidth
etviewportHeight
pour être exact.50%
est le centre de la vue animée.50%p
est le centre du parent<scale android:fromXScale="1.0" android:toXScale="1.2" android:fromYScale="1.0" android:toYScale="1.2" android:pivotX="50%" android:pivotY="50%" android:duration="175"/>
la source
50%p
dans les fichiers Java, au lieu de XML?La réponse fournie par @stevanveltema et @JiangQi est parfaite, mais si vous voulez une mise à l'échelle à l'aide du code, vous pouvez utiliser ma réponse.
// first 0f, 1f mean scaling from X-axis to X-axis, meaning scaling from 0-100% // first 0f, 1f mean scaling from Y-axis to Y-axis, meaning scaling from 0-100% // The two 0.5f mean animation will start from 50% of X-axis & 50% of Y-axis, i.e. from center 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); // animation duration in milliseconds fade_in.setFillAfter(true); // If fillAfter is true, the transformation that this animation performed will persist when it is finished. view.startAnimation(fade_in);
la source
Vous pouvez utiliser l'animation de traduction dans votre ensemble pour compenser cela. Vous devrez probablement modifier les valeurs toXDelta et toYDelta pour bien faire les choses afin de maintenir l'image centrée.
<set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1" android:fromYScale="1" android:toXScale="1.2" android:toYScale="1.2" android:duration="175"/> <translate android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="-20%" android:toYDelta="-20%" android:duration="175"/> </set>
la source