¿Cómo utilizo 'RotateDrawable'?

¿Podría alguien decirme cómo han conseguido 'RotateDrawable' trabajar si sea de código o XML o ambos? La documentación sobre dibujos animados es bastante pobre y la animación sólo parece funcionar para las imágenes. Quiero ser capaz de animar todos los dibujables. Cuando traté de obtener un RotateDrawble de XML es sólo causa una excepción. ¿Cuál es la función correcta para encontrar un RotateDrawable de XML?

Muchas gracias

Kerubu

Tienes que animar la propiedad "level", donde 0 es el valor inicial y 10000 es el valor final.

El siguiente ejemplo anima de principio a fin, puede invertir la animación fácilmente con este método.

final RotateDrawable rotateDrawable = ... ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000).start(); 

RotateDrawable no parece estar animado. En su lugar, tiene que utilizar setLevel para cambiar la rotación de la drawable.

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

Y establecer el nivel girará el dibujable:

 final ImageView image = (ImageView)findViewById(R.id.imageView1); final RotateDrawable drawable = (RotateDrawable)image.getDrawable(); drawable.setLevel(500); 

Este es un buen ejemplo de trabajo. La duración del parámetro se utiliza para animarlo.

 <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="4000" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="720" > <shape android:innerRadius="20dp" android:shape="ring" android:thickness="4dp" android:useLevel="false" > <size android:height="48dp" android:width="48dp" /> <gradient android:centerY="0.5" android:endColor="@android:color/white" android:startColor="#00ffffff" android:type="sweep" android:useLevel="false" /> </shape> </rotate> 

No he trabajado con un RotateDrawable, pero si simplemente estás tratando de animar la rotación en un gráfico, no lo necesitas. Dibujos con un "nivel" como RotateDrawable están destinados a transmitir información en lugar de animar las vistas.

El código siguiente gira un ImageView alrededor de su centro:

 ImageView myImageView = (ImageView)findViewById(R.id.my_imageview); AnimationSet animSet = new AnimationSet(true); animSet.setInterpolator(new DecelerateInterpolator()); animSet.setFillAfter(true); animSet.setFillEnabled(true); final RotateAnimation animRotate = new RotateAnimation(0.0f, -90.0f, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); animRotate.setDuration(1500); animRotate.setFillAfter(true); animSet.addAnimation(animRotate); myImageView.startAnimation(animSet); 

El código siguiente devuelve un wrapper Drawable que rota otro Drawable programmatically:

 Drawable rotateDrawable(Drawable d, final float angle) { // Use LayerDrawable, because it's simpler than RotateDrawable. Drawable[] arD = { d }; return new LayerDrawable(arD) { @Override public void draw(Canvas canvas) { canvas.save(); canvas.rotate(angle); super.draw(canvas); canvas.restore(); } }; } 

Podrías llamar a RotatedDrawable.setLevel () para girar el drawable, o podrías leer el código de ProgressBar, el drawable indeterminado es un LayerDrawable cuyos hijos fueron RotatedDrawable, como este:

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <rotate android:drawable="@drawable/spinner_48_outer_holo" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="1080" /> </item> <item> <rotate android:drawable="@drawable/spinner_48_inner_holo" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="720" android:toDegrees="0" /> </item> </layer-list> 

La animación de rotación fue impulsada por el método onDraw de ProgressBar.

Me gustaría añadir un ejemplo completo de animación de un icono de progreso en ImageView, se basa en Mark Hetherington respuesta.

Así que mi animación se ve así:

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

El icono viene de https://material.io/icons/

Entonces mi diseño contiene un ImageView como sigue:

  <ImageView android:id="@+id/progress" android:layout_marginTop="0dp" android:layout_marginLeft="-3dp" android:layout_width="30dp" android:layout_height="30dp" android:visibility="gone" android:scaleType="fitCenter" android:background="@drawable/progress_anim" android:layout_gravity="center_horizontal|center_vertical" /> 

Y finalmente en el código cuando necesito mostrar la animación que hago:

  RotateDrawable rotateDrawable = ((RotateDrawable)progressImage.getBackground()); ObjectAnimator anim = ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000); anim.setDuration(1000); anim.setRepeatCount(ValueAnimator.INFINITE); anim.start(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.