2010-01-09 7 views
52

Ich habe ein Layout mit einer Bildansicht und einer Webansicht erstellt. Die Webansicht ist auf eine Standardsichtbarkeit von "gegangen" eingestellt. Wenn die Aktivität gestartet wird, wird zuerst die Bildansicht angezeigt, und wenn die Webansicht ihre URL geladen hat, markiert sie sich selbst als sichtbar und die Bildansicht wird als ausgeblendet markiert.Android ImageView Animation

Wenn das Bild angezeigt wird, möchte ich es immer nur für ein wenig zusätzlichen Pizazz drehen.

Ich habe noch nie Animationen in Android gemacht und alle Beiträge, die ich fand, als ich das Internet fragte, waren nicht hilfreich; Daher bin ich zur Hilfe nach SO zurückgekehrt.

Also, wenn ich mit diesem beginnen ...

final ImageView splash = (ImageView)findViewById(R.id.splash); 

Wie erstelle ich eine wiederholten drehen Animation und an das Image bewerben?

Danke nochmal!

Antwort

93

Verwenden Sie RotateAnimation und setzen Sie den Drehpunkt auf die Mitte des Bildes.

RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f); 
anim.setInterpolator(new LinearInterpolator()); 
anim.setRepeatCount(Animation.INFINITE); 
anim.setDuration(700); 

// Start animating the image 
final ImageView splash = (ImageView) findViewById(R.id.splash); 
splash.startAnimation(anim); 

// Later.. stop the animation 
splash.setAnimation(null); 
+5

So stellen Sie relative Drehpunkte ein: new RotateAnimation (0f, 350f, 15f, 15f); Oder muss ich prüfen, ob der Bildschirm vorher ldpi, mdpi oder hdpi ist und einen Multiplikator für die Pivot-Werte einstellen? Ich habe auch bemerkt, dass mein Bild nicht in die ursprüngliche Position zurückkehrt. Im Gegensatz zum nativen Android Spinner. (Ich möchte das Standard-Android-Spinner in einer Bildansicht verwenden und es so aussehen lassen wie das Original.) – OneWorld

+1

Gleiche Frage wie OneWorld. Ich habe keine bequeme Drehung, da die Koordinaten des Drehzentrums nicht korrekt sind, auch wenn ich als Mitte der Drehung die Hälfte der Koordinate festlege, die durch splash.getWidth() und splashgetHeight() erhalten wird. Wie kann ich dieses Problem lösen? –

+0

Danke, es hat funktioniert .. –

9

Einweg - teilen Sie Bild in N und drehen es jedes Mal ein wenig. Ich würde sagen, 5 ist genug. dann so etwas wie dies in ziehbar

<animation-list android:id="@+id/handimation" android:oneshot="false" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/progress1" android:duration="150" /> 
    <item android:drawable="@drawable/progress2" android:duration="150" /> 
    <item android:drawable="@drawable/progress3" android:duration="150" /> 
</animation-list> 

Code erstellen starten

progress.setVisibility(View.VISIBLE); 
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable(); 
frameAnimation.setCallback(progress); 
frameAnimation.setVisible(true, true); 

Code Stop

AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable(); 
frameAnimation.stop(); 
frameAnimation.setCallback(null); 
frameAnimation = null; 
progress.setVisibility(View.GONE); 

mehr here

+0

Vielen Dank für die Dokumentation dieser Lösung. Auch wenn die von anderen gegebene Rotationsantwort dem Zweck der ursprünglichen Frage entspricht, ist Ihre Lösung genau das, wonach ich auf andere Weise animieren möchte. – CodeChimp

+1

Dies wäre eine schreckliche Art, das gewünschte Ziel zu erreichen, wenn es bereits eine Rotationsanimation gibt. Warum alles manuell: riesige Ressourcenspeicher-Overheads. – RichieHH

22

Sie können auch einfach die Funktion Drehen Animation verwenden. Dadurch wird eine bestimmte Animation für eine bestimmte Zeit auf einem ImageView ausgeführt.

Animation rotate = AnimationUtils.loadAnimation([context], R.anim.rotate_picture); 
splash.startAnimation(rotate); 

Dann eine Animation XML-Datei in Ihrem res/anim rotate_picture mit dem Inhalt aufgerufen erstellen:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 

    <rotate 
    android:fromDegrees="0" 
    android:toDegrees="360" 
    android:duration="5000" 
    android:pivotX="50%" 
    android:pivotY="50%"> 
</rotate> 
</set> 

Jetzt leider wird dies nur einmal ausgeführt werden. Sie benötigen eine Schleife, um die Animation während des Wartens zu wiederholen. Ich habe ein bisschen experimentiert und mein Programm in endlosen Loops stecken lassen, daher bin ich mir nicht sicher, wie das am besten aussehen könnte. EDIT: Christopher Antwort bietet die Informationen, wie man es richtig Schleife, so entfernen Sie meine schlechte Vorschlag über separate Threads!

+1

kannst du nicht hinzufügen 'android: repeatCount =" infinite "' .... oder mach ein 'rotate.setRepeatCount (Animation.INFINITE)' –

+0

Ich mag diese Lösung sehr: die Abstraktion zum XML ist viel schöner. – RichieHH

+0

Ich frage mich, wie man die Animation stoppt? –

5

Im Inneren des Elements setzen:

android:repeatCount="infinite" 
3

ich herausgefunden haben, dass, wenn Sie die .getWidth/2 usw. verwenden ... dass es nicht funktionieren wird die Anzahl der bekommen müssen Pixel ist das Bild und teilen Sie es durch 2 selbst und geben Sie dann einfach die Zahl für die letzten 2 Argumente ein.

so sagen, Ihr Bild war ein 120 Pixel x 120 Pixel Quadrat, ur x und y wäre gleich 60 Pixel. so in Ihrem Code, würden Sie rechts:

RotateAnimation anim = new RotateAnimation(0f, 350f, 60f, 60f); 
anim.setInterpolator(new LinearInterpolator()); 
anim.setRepeatCount(Animation.INFINITE); 
anim.setDuration(700); 

und jetzt Ihr Bild um seine Mitte schwenken wird.

41

, wie ein Bild um seine Mitte drehen:

ImageView view = ... //Initialize ImageView via FindViewById or programatically 

RotateAnimation anim = new RotateAnimation(0.0f, 360.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 

//Setup anim with desired properties 
anim.setInterpolator(new LinearInterpolator()); 
anim.setRepeatCount(Animation.INFINITE); //Repeat animation indefinitely 
anim.setDuration(700); //Put desired duration per anim cycle here, in milliseconds 

//Start animation 
view.startAnimation(anim); 
//Later on, use view.setAnimation(null) to stop it. 

Dies bewirkt, dass das Bild um seinen Mittelpunkt (0,5 oder 50% seiner Breite/Höhe) drehen. Ich poste dies für zukünftige Leser, die wie ich von Google kommen und das Bild um sein Zentrum drehen wollen, ohne das Zentrum in absoluten Pixeln zu definieren.

+3

Das war perfekt für meine Anforderungen. Die einzige Änderung, die ich brauchte, war die Angabe von Animation.RELATIVE_TO_SELF anstelle von 'Dimension.RelativeToSelf'. – Guru

7
imgDics = (ImageView) v.findViewById(R.id.img_player_tab2_dics); 
    imgDics.setOnClickListener(onPlayer2Click); 
    anim = new RotateAnimation(0f, 360f, 
      Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 
          0.5f); 
    anim.setInterpolator(new LinearInterpolator()); 
    anim.setRepeatCount(Animation.INFINITE); 
    anim.setDuration(4000); 

    // Start animating the image 
    imgDics.startAnimation(anim); 
+0

klingt gut in Bezug auf die Rotation von 'SELF' funktioniert gut für mich. (+1) – Anuj

0

Bildgrenzen nicht hart codieren. Verwenden Sie einfach:

RotateAnimation anim = new RotateAnimation(fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);