2011-05-03 1 views
10

Quelqu'un peut-il me dire comment ils ont 'RotateDrawable' pour fonctionner que ce soit à partir de code ou XML ou les deux? La documentation sur l'animation des Drawables est plutôt pauvre et l'animation ne semble fonctionner que pour les images. Je veux être capable d'animer tous les drawables. Lorsque j'ai essayé d'obtenir un RotateDrawble à partir de XML, cela provoque une exception. Quelle est la fonction correcte pour trouver un RotateDrawable à partir de XML?Comment utiliser "RotateDrawable"?

Un grand merci

Kerubu

+0

Je ne comprends pas la question. voulez-vous avoir une animation, ou simplement faire pivoter l'image à l'intérieur? Pour la rotation, consultez ce post: http://stackoverflow.com/a/21376008/878126 –

Répondre

1

Je n'ai pas travaillé avec un RotateDrawable, mais si vous essayez simplement d'animer la rotation sur un graphique, vous n'avez pas besoin. Les drawables avec un 'niveau' comme RotateDrawable sont destinés à transmettre des informations plutôt qu'à animer des vues.

Le code suivant tourne un ImageView autour de son centre:

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

Merci pour votre réponse David. Si je comprends bien votre méthode, cela fait pivoter la vue ENTIER alors que j'aimerais finalement pouvoir faire tourner/animer un seul Dessin dans une vue par exemple un pointeur tourne sur un fond qui est fixe comme c'est l'échelle d'un cadran . C'est pourquoi j'essaie d'utiliser le RotateDrawable mais malheureusement je ne comprends pas les docs! – Kerry

2

RotateDrawable ne semble pas être animée. Au lieu de cela, vous devez utiliser setLevel pour modifier la rotation du 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" /> 

et régler le niveau tournera la drawable:

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

Il me manque encore quelque chose ici. D'abord, que faites-vous avec le tag . Vous ne le gonflez nulle part. Et puis j'essaye de lancer un drawable à un RotateDrawable et obtenir l'exception suivante de cast java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable –

+0

Je suppose que mon exemple suppose qu'il y a une disposition et cette disposition utilise un ImageView avec RotateDrawable. Si vous avez un bitmap, le RotateDrawable le référence, pas la mise en page. –

+1

Comment définissez-vous la vitesse de l'animation? J'ai essayé différentes valeurs pour "durée", mais il ne semble pas faire n'importe quoi ... –

1

Le code suivant retourne une enveloppe Drawable qui tourne un autre Drawable programme:

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

vous avez oublié de placer le pivot sur la fonction rotate(). Voici une meilleure solution: http://stackoverflow.com/a/21376008/878126 –

1

Vous pouvez appeler manuellement RotatedDrawable.setLevel() pour faire pivoter le drawable, ou vous pouvez lire le code de ProgressBar, le drawable indéterminé est un LayerDrawable dont les enfants ont été RotatedDrawable, comme celui-ci:

<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> 

L'animation de rotation était pilotée par la méthode onDraw de ProgressBar.

7

Vous devez animer la propriété "level", où 0 est la valeur de départ et 10000 la valeur de fin. L'exemple ci-dessous s'anime du début à la fin, vous pouvez facilement inverser l'animation avec cette méthode.

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

Ceci est un bon exemple de travail. La durée du paramètre est utilisée pour l'animer.

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

Je voudrais ajouter un exemple complet d'animer une icône de progression sur ImageView, il est basé sur la réponse Mark Hetherington.

Donc, mon animation se présente comme suit:

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

icône vient de https://material.io/icons/

alors ma mise en page contient un ImageView comme suit:

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

et enfin dans le code quand je dois montrer l'animation que je fais:

RotateDrawable rotateDrawable = ((RotateDrawable)progressImage.getBackground()); 
    ObjectAnimator anim = ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000); 
    anim.setDuration(1000); 
    anim.setRepeatCount(ValueAnimator.INFINITE); 
    anim.start();