Imagen giratoria. Animación de la lista o rotación animada? (Androide)

Quiero crear una imagen de progreso giratoria, y me pregunto cuál es la mejor manera de proceder. Puedo hacer que funcione con una lista de la animación con por ejemplo 12 imágenes que cambian cada 100ms. Esto funciona bien, pero es bastante tedioso para crear 12 imágenes o para cada tamaño y resolución:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/ic_loading_grey_on_black_01" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_02" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_03" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_04" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_05" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_06" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_07" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_08" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_09" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_10" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_11" android:duration="100" /> <item android:drawable="@drawable/ic_loading_grey_on_black_12" android:duration="100" /> 

Supongo que una solución más fácil es usar una imagen por resolución, sino girarla para cada fotograma. En los recursos de la plataforma (android-sdk-windows / plataformas …) encontré algo llamado animated-rotate en el archivo drawable / search_spinner.xml, pero si copio el código obtengo un error del compilador quejándose de android: framesCount y android: FrameDuration (API de Google 2.2 en Eclipse):

 <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/spinner_black_20" android:pivotX="50%" android:pivotY="50%" android:framesCount="12" android:frameDuration="100" /> 

También he intentado usar una animación repetida de rotación (usar en la carpeta del recurso del anim), pero prefiero realmente el aspecto de la versión de la lista de la animación.

¿Cuál es la forma recomendada de resolver este problema?

Rotate drawable sugerido por Praveen no le dará control de la cuenta de fotogramas. Supongamos que desea implementar un cargador personalizado que consta de 8 secciones:

Gif_icon

Usando el enfoque de animation-list , necesita crear 8 marcos girados por 45*frameNumber grados manualmente. Alternativamente, puede utilizar el primer fotograma y configurar la animación de rotación:

Progreso_icon

Archivo res/anim/progress_anim.xml :

 <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" /> 

Archivo MainActivity.java

 Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim); a.setDuration(1000); imageView.startAnimation(a); 

Esto le dará una animación suave en lugar de 8 escalones. Para solucionar esto necesitamos implementar un interpolador personalizado:

 a.setInterpolator(new Interpolator() { private final int frameCount = 8; @Override public float getInterpolation(float input) { return (float)Math.floor(input*frameCount)/frameCount; } }); 

También puedes crear un widget personalizado:

Archivo res/values/attrs.xml :

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="ProgressView"> <attr name="frameCount" format="integer"/> <attr name="duration" format="integer" /> </declare-styleable> </resources> 

Archivo ProgressView.java :

 public class ProgressView extends ImageView { public ProgressView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setAnimation(attrs); } public ProgressView(Context context, AttributeSet attrs) { super(context, attrs); setAnimation(attrs); } public ProgressView(Context context) { super(context); } private void setAnimation(AttributeSet attrs) { TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ProgressView); int frameCount = a.getInt(R.styleable.ProgressView_frameCount, 12); int duration = a.getInt(R.styleable.ProgressView_duration, 1000); a.recycle(); setAnimation(frameCount, duration); } public void setAnimation(final int frameCount, final int duration) { Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim); a.setDuration(duration); a.setInterpolator(new Interpolator() { @Override public float getInterpolation(float input) { return (float)Math.floor(input*frameCount)/frameCount; } }); startAnimation(a); } } 

Archivo activity_main.xml :

 <com.example.widget.ProgressView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_progress" app:frameCount="8" app:duration="1000"/> 

Archivo res/anim/progress_anim.xml : listado arriba

Tienes que crear un archivo xml dibujable como a continuación:

Código:

 <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="360" android:drawable="@drawable/imagefile_to_rotate" /> 

Encontré la respuesta de vokilam para ser la mejor para crear una animación escalonada / escalonada agradable. Fui para su última sugerencia e hizo un widget personalizado, el único problema que encontré fue que la visibilidad de ajuste no funcionaría porque estaba animado y por lo tanto siempre sería visible …

He ajustado su código (ProgressView.java que he renombrado StaggeredProgress.java) así:

 public class StaggeredProgress extends ImageView { private Animation staggered; public StaggeredProgress(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setAnimation(attrs); } public StaggeredProgress(Context context, AttributeSet attrs) { super(context, attrs); setAnimation(attrs); } public StaggeredProgress(Context context) { super(context); } private void setAnimation(AttributeSet attrs) { TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.StaggeredProgress); int frameCount = a.getInt(R.styleable.StaggeredProgress_frameCount, 12); int duration = a.getInt(R.styleable.StaggeredProgress_duration, 1000); a.recycle(); setAnimation(frameCount, duration); } public void setAnimation(final int frameCount, final int duration) { Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim); a.setDuration(duration); a.setInterpolator(new Interpolator() { @Override public float getInterpolation(float input) { return (float)Math.floor(input*frameCount)/frameCount; } }); staggered = a; //startAnimation(a); } @Override public void setVisibility(int visibility) { super.setVisibility(visibility); if( visibility == View.VISIBLE ) startAnimation(staggered); else clearAnimation(); } } 

Esta forma de establecer la visibilidad de la vista comienza y detiene la animación según sea necesario … Muchas gracias de nuevo a vokilam!

Ver ejemplos aquí http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/index.html

Específicamente: Progress Bar

  1. Incremental Demuestra los indicadores de progreso rotatorios grandes y pequeños que se pueden incrementar o disminuir en unidades.
  2. Smooth Demuestra grandes y pequeños indicadores de progreso continuamente giratorios utilizados para indicar un mensaje genérico de "ocupado".
  3. Diálogos Demuestra un ProgressDialog, un diálogo emergente que aloja una barra de progreso. Este ejemplo demuestra indicadores de progreso determinados e indeterminados.
  4. En barra de título Demuestra una pantalla de actividad con un indicador de progreso cargado al establecer la característica de indicador de progreso de WindowPolicy.

La solución de SACPK definitivamente funciona. Otra solución puede ser utilizar <animated-rotate> como en cuestión y eliminar android:framesCount="12" android:frameDuration="100" atributos para los que el compilador se queja. Todavía funciona incluso para mi imagen de 8 cuadros.

Sin embargo, no he descubierto cómo controlar la velocidad de la animación :(.

  • Cómo girar un icono de Android en su punto central?
  • Detectar algoritmo de giro de 360 ​​grados
  • Uso de Matrix. Rotar en OpenGL ES 2.0
  • Deshabilitar y habilitar cambios de orientación en una actividad en Android mediante programación
  • Android ProgressBar personalizado no está girando
  • Rotar correctamente las imágenes web utilizando Picasso de Square
  • Después de la rotación de la pantalla, se cambiará el idioma de mi aplicación
  • Android: Obtener rotación EXIF ​​desde URI
  • La aplicación que utiliza libgdx se reinicia siempre que el dispositivo gira
  • Android: orientación de la vista previa de la cámara en modo vertical
  • Perder datos al girar la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.