2011-12-07 18 views
64

Tengo un ImageView y hago una animación de escala simple para él. Código muy estándar.Animación de escala de imagen de Android relativa al punto central

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 Escalas no escala del centro, pero a partir de 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. Here's a link that explains what I mean. 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, alinear a la izquierda o a la derecha, siempre se escala igual. Estoy usando RelativeLayout para la pantalla principal y ImageView está ubicado en otro RelativeLayout, pero probé otros diseños, sin cambios.

Respuesta

63

Forget la traducción, establezca android:pivotX, android:pivotY a la mitad de la anchura y la altura y va a escalar desde el centro de la imagen.

5

Puede usar la animación de traducir en su conjunto para compensar eso. Probablemente necesite ajustar los valores toXDelta y toYDelta para hacerlo bien, de modo que mantenga 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> 
123

50% es el centro de la vista animada.

50%p es el centro de la matriz

<scale 
    android:fromXScale="1.0" 
    android:toXScale="1.2" 
    android:fromYScale="1.0" 
    android:toYScale="1.2" 
    android:pivotX="50%p" 
    android:pivotY="50%p" 
    android:duration="175"/> 

+0

50% p hizo el trabajo. –

+21

para mí 50% hizo el trabajo (sin p) – agamov

+2

debe ser sin p si es relativo al ancho o alto del componente al que está aplicando la animación. p se refiere al padre del componente al que está aplicando la animación. –

70

La respuesta proporcionada por @stevanveltema y @JiangQi son perfectos, pero si quieres escalar usando el código, entonces usted puede utilizar 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); 
+1

@ T.Todua ¿Qué errores? Por favor, haga una nueva pregunta y enlace a esta respuesta. –

+0

Solucionado, los problemas estaban de mi lado ... gracias. –

Cuestiones relacionadas