2010-01-09 24 views
52

He creado un diseño con una vista de imagen y una vista web. La vista web está configurada para tener una visibilidad predeterminada de desaparecido. Cuando la actividad se activa, muestra primero la vista de la imagen y cuando la vista web ha terminado de cargar su url, se marca a sí misma como visible y la vista de la imagen se marca como oculta.Android ImageView Animation

Cuando se muestra la imagen, me gustaría rotarla repetidamente solo por un poco de pizazz añadido.

Nunca antes he hecho animaciones en Android y todas las publicaciones que encontré cuando pregunté en Internet no fueron útiles; por lo tanto, he regresado a SO para obtener ayuda.

Así que si comienzo con esto ...

final ImageView splash = (ImageView)findViewById(R.id.splash); 

¿Cómo se crea una animación de rotación repetida y aplicarlo a la ImageView?

¡Gracias nuevamente!

Respuesta

93

Utilice un RotateAnimation, estableciendo el punto de pivote en el centro de su imagen.

RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f); 
anim.setInterpolator(new LinearInterpolator()); 
anim.setRepeatCount(Animation.INFINITE); 
anim.setDuration(700); 

// Start animating the image 
final ImageView splash = (ImageView) findViewById(R.id.splash); 
splash.startAnimation(anim); 

// Later.. stop the animation 
splash.setAnimation(null); 
+5

Cómo establecer puntos de pivote relativos aquí: nueva rotación de animación (0f, 350f, 15f, 15f); ¿O debo verificar si la pantalla es ldpi, mdpi o hdpi antes y ajustar un multiplicador para los valores de pivote? También noté que mi imagen no vuelve a la posición original. A diferencia del spinner nativo de Android. (Quiero usar el spinner android predeterminado en una vista de imagen y hacer que se vea como el original.) – OneWorld

+1

La misma pregunta que OneWorld. No tengo una rotación conveniente ya que las coordenadas del centro de pivote no son correctas, incluso si defino como centro de la rotación la mitad del coordinado obtenido por splash.getWidth() y splashgetHeight(). ¿Cómo resolver este problema? –

+0

Gracias, funcionó .. –

9

Una forma: divida la imagen en N girándola ligeramente cada vez. Yo diría que 5 es suficiente. continuación, crear algo como esto en dibujable código

<animation-list android:id="@+id/handimation" android:oneshot="false" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/progress1" android:duration="150" /> 
    <item android:drawable="@drawable/progress2" android:duration="150" /> 
    <item android:drawable="@drawable/progress3" android:duration="150" /> 
</animation-list> 

comenzar

progress.setVisibility(View.VISIBLE); 
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable(); 
frameAnimation.setCallback(progress); 
frameAnimation.setVisible(true, true); 

parada código

AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable(); 
frameAnimation.stop(); 
frameAnimation.setCallback(null); 
frameAnimation = null; 
progress.setVisibility(View.GONE); 

más here

+0

Gracias por documentar esta solución. Aunque la respuesta de rotación dada por otros se adapta al propósito de la pregunta original, tu solución es justamente lo que estoy buscando para animar de otras maneras. – CodeChimp

+1

Esta sería una forma horrible de lograr el objetivo deseado cuando ya hay una animación de rotación. ¿Por qué hacerlo todo manualmente: grandes gastos generales de almacenamiento de recursos. – RichieHH

22

También puede simplemente utilizar la función de animación Girar. Eso ejecuta una animación específica, por una cantidad de tiempo predeterminada, en un ImageView.

Animation rotate = AnimationUtils.loadAnimation([context], R.anim.rotate_picture); 
splash.startAnimation(rotate); 

A continuación, cree un archivo XML la animación en sus res/anim llama rotate_picture con el contenido:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 

    <rotate 
    android:fromDegrees="0" 
    android:toDegrees="360" 
    android:duration="5000" 
    android:pivotX="50%" 
    android:pivotY="50%"> 
</rotate> 
</set> 

Ahora por desgracia, esto solo se ejecutará una vez. Necesitará un bucle en algún lugar para que repita la animación mientras espera. Experimenté un poco y conseguí que mi programa quedara atrapado en bucles infinitos, así que no estoy seguro de la mejor manera de hacerlo. EDIT: la respuesta de Christopher proporciona la información sobre cómo hacer que funcione correctamente, ¡así que elimino mi mala sugerencia sobre hilos separados!

+1

no se puede agregar 'android: repeatCount =" infinite "'? .... o hacer un 'rotate.setRepeatCount (Animation.INFINITE)' –

+0

Me gusta mucho esta solución: abstraerse al XML es mucho mejor. – RichieHH

+0

Me pregunto cómo detener la animación? –

5

Dentro del elemento puso:

android:repeatCount="infinite" 
3

he descubierto, que si se utiliza el .getWidth/2 etc ... que no va a funcionar que necesita para obtener el número de píxeles de la imagen es y divídalo por 2 usted mismo y luego simplemente escriba el número de los últimos 2 argumentos.

para decir que su imagen era un cuadrado de 120 por 120 píxeles, ur x y y equivaldrían a 60 píxeles. por lo que en su código, juicio lo haría:

RotateAnimation anim = new RotateAnimation(0f, 350f, 60f, 60f); 
anim.setInterpolator(new LinearInterpolator()); 
anim.setRepeatCount(Animation.INFINITE); 
anim.setDuration(700); 

y ahora su imagen girará alrededor de su centro.

41

Cómo rotar una imagen alrededor de su centro:

ImageView view = ... //Initialize ImageView via FindViewById or programatically 

RotateAnimation anim = new RotateAnimation(0.0f, 360.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 

//Setup anim with desired properties 
anim.setInterpolator(new LinearInterpolator()); 
anim.setRepeatCount(Animation.INFINITE); //Repeat animation indefinitely 
anim.setDuration(700); //Put desired duration per anim cycle here, in milliseconds 

//Start animation 
view.startAnimation(anim); 
//Later on, use view.setAnimation(null) to stop it. 

Esto hará que la imagen para girar alrededor de su centro (0,5 o 50% de su anchura/altura). Estoy publicando esto para lectores futuros que llegan aquí desde Google, como lo hice yo, y que desean rotar la imagen alrededor de su centro sin definir dicho centro en píxeles absolutos.

+3

Esto fue perfecto para mis requerimientos. El único cambio que necesitaba era especificar Animation.RELATIVE_TO_SELF en lugar de 'Dimension.RelativeToSelf'. – Guru

7
imgDics = (ImageView) v.findViewById(R.id.img_player_tab2_dics); 
    imgDics.setOnClickListener(onPlayer2Click); 
    anim = new RotateAnimation(0f, 360f, 
      Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 
          0.5f); 
    anim.setInterpolator(new LinearInterpolator()); 
    anim.setRepeatCount(Animation.INFINITE); 
    anim.setDuration(4000); 

    // Start animating the image 
    imgDics.startAnimation(anim); 
+0

suena bien con respecto a la rotación de 'SELF' funciona bien para mí. (+1) – Anuj

0

No codificar los límites de la imagen. Simplemente use:

RotateAnimation anim = new RotateAnimation(fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);