Tengo un ImageView y le hago una animación a escala simple. Código muy estándar.
Mi 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>
Mi código de animación:
Animation a = AnimationUtils.loadAnimation(this, R.anim.scale_up);
((ImageView) findViewById(R.id.circle_image)).startAnimation(a);
El problema:
Cuando la imagen se escala, no se escala desde el centro, sino desde la esquina superior izquierda. En otras palabras, la versión escalada de la imagen no tiene el mismo punto que el centro, pero tiene el mismo punto superior izquierdo. Aquí hay un enlace que explica lo que quiero decir. La primera imagen es cómo se escala la animación, y la segunda imagen es cómo quiero que se escale. Debe mantener el punto central igual. He intentado configurar la gravedad en la imagen, en el contenedor, alineando a la izquierda o a la derecha, siempre se escala igual. Estoy usando RelativeLayout para la pantalla principal e ImageView está ubicado en otro RelativeLayout, pero probé otros diseños, sin cambios.
fuente
pivotX
ypivotY
debe establecerse en la mitadviewportWidth
yviewportHeight
para ser exactos.50%
es el centro de la vista animada.50%p
es el centro de los padres<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"/>
fuente
50%p
en archivos Java, en lugar de XML?La respuesta proporcionada por @stevanveltema y @JiangQi es perfecta, pero si desea escalar usando código, puede usar mi respuesta.
// 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);
fuente
Puede usar la animación de traducción en su conjunto para compensar eso. Probablemente necesite ajustar los valores de toXDelta y toYDelta para hacerlo bien y mantener la imagen centrada.
<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>
fuente