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):
- Zoom de Android y rotación de la vista de imagen
- Metadatos de rotación de vídeo Mp4
- Animación giratoria androide
- Cómo girar un icono de Android en su punto central?
- Android: gira todo el diseño
<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?
- Android Animated Vector Drawable: cambia el grado de rotación en tiempo de ejecución
- La orientación del grabador de vídeo JavaCV no es adecuada en modo retrato
- Cómo evitar que toda la pantalla de actividad de rotación en android
- ¿Qué se llama después de "onConfigurationChanged ()"?
- Uso de Matrix. Rotar en OpenGL ES 2.0
- Dibujar el texto verticalmente sobre lienzo
- RotateAnimation sin duración
- ¿Cuál es la ventaja de dejar que una actividad sea destruida en rotación?
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:
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:
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
- Incremental Demuestra los indicadores de progreso rotatorios grandes y pequeños que se pueden incrementar o disminuir en unidades.
- Smooth Demuestra grandes y pequeños indicadores de progreso continuamente giratorios utilizados para indicar un mensaje genérico de "ocupado".
- Diálogos Demuestra un ProgressDialog, un diálogo emergente que aloja una barra de progreso. Este ejemplo demuestra indicadores de progreso determinados e indeterminados.
- 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 :(.
- Simulando un clic en un elemento de menú en Robolectric
- GCM de Android enviado correctamente pero no recibido en algunos dispositivos