2011-05-03 4 views
10

¿Alguien podría decirme cómo han hecho que 'GotateDrawable' funcione ya sea de código o XML, o de ambos? La documentación sobre la animación de Drawables es bastante pobre y la animación solo parece funcionar para las imágenes. Quiero poder animar todos los drawables. Cuando intenté obtener un RotateDrawble de XML solo causa una excepción. ¿Cuál es la función correcta para encontrar un RotateDrawable de XML?¿Cómo uso 'RotarDibujado'?

Muchas gracias

Kerubu

+0

no entiendo la pregunta. ¿Quieres tener una animación, o simplemente rotar la imagen dentro? para la rotación, echa un vistazo a esta publicación: http://stackoverflow.com/a/21376008/878126 –

Respuesta

1

No he trabajado con un RotateDrawable, pero si usted está simplemente tratando de animar la rotación en un gráfico, que no lo necesita. Los drenables con un 'nivel' como RotateDrawable están destinados a transmitir información en lugar de vistas animadas.

El siguiente código hace girar un ImageView alrededor de su centro: no parece

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); 
+2

Gracias por su respuesta David. Si entiendo tu método correctamente, esto rota la vista ENTERA mientras que en última instancia me gustaría poder rotar/animar un único Drawable en una vista, por ejemplo, un puntero gira sobre un fondo que está fijo ya que es la escala de un dial . ¡Esta es la razón por la que trato de utilizar el RotateDrawable pero desafortunadamente no puedo entender los documentos! – Kerry

2

RotateDrawable ser animado. En su lugar, debe usar setLevel para cambiar la rotación del dibujable.

<?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 rotará el dibujable:

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

Todavía me falta algo aquí. Primero, ¿qué haces con la etiqueta ? No lo estás inflando en ningún lado. Y segundo, intento lanzar un dibujable a un RotateDrawable y obtener la siguiente excepción de conversión. java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable –

+0

Supongo que mi ejemplo asume que hay un diseño y que el diseño usa un ImageView con el RotativoDibujado. Si tiene un mapa de bits, RotateDrawable lo referencia, no el diseño. –

+1

¿Cómo se establece qué tan rápido es la animación? He intentado varios valores para "duración", pero parece que no hace nada ... –

1

El código siguiente devuelve un envoltorio que gira Disponibles Disponibles otra programación:

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(); 
     } 
    }; 
} 
+0

olvidaste configurar el pivote en la función rotar(). aquí hay una mejor solución: http://stackoverflow.com/a/21376008/878126 –

1

se le puede llamar manualmente RotatedDrawable.setLevel() para rotar el dibujable, o puede leer el código de ProgressBar, el dibujable indeterminado es un LayerDrawable cuyos hijos fueron RotadosDibujados, 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 se realizó con el método de OnDraw de ProgressBar.

7

Tiene que animar la propiedad "nivel", 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(); 
2

Este es un buen ejemplo de trabajo. La duración de Param se usa 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> 
1

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

Así que mi animación se ve de la siguiente manera:

<?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" 
    /> 

icono proviene de https://material.io/icons/

entonces mi diseño contiene una ImageView de la siguiente manera:

 <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 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();