Ich verwende a RotateAnimation
, um ein Bild zu drehen, das ich als benutzerdefinierten zyklischen Spinner in Android verwende. Hier ist meine rotate_indefinitely.xml
Datei, in die ich gelegt habe res/anim/
:
<?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"
android:duration="1200" />
Wenn ich dies auf meine ImageView
Verwendung anwende AndroidUtils.loadAnimation()
, funktioniert es großartig!
spinner.startAnimation(
AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely) );
Das einzige Problem ist, dass die Bilddrehung am Anfang jedes Zyklus anzuhalten scheint.
Mit anderen Worten, das Bild dreht sich um 360 Grad, hält kurz an und dreht sich dann wieder um 360 Grad usw.
Ich vermute, dass das Problem darin besteht, dass die Animation einen Standardinterpolator wie android:iterpolator="@android:anim/accelerate_interpolator"
( AccelerateInterpolator
) verwendet, aber ich weiß nicht, wie ich ihm sagen soll, dass die Animation nicht interpoliert werden soll.
Wie kann ich die Interpolation deaktivieren (wenn dies tatsächlich das Problem ist), um meinen Animationszyklus reibungslos zu gestalten?
Ich hatte auch dieses Problem und versuchte erfolglos, den linearen Interpolator in XML zu setzen. Die Lösung, die für mich funktioniert hat, bestand darin, die Animation als RotateAnimation im Code zu erstellen.
quelle
rotate.setFillAfter(true);
rotate.setRepeatCount(Animation.INFINITE);
Das funktioniert gut
Umkehren rückwärts drehen:
quelle
Vielleicht hilft so etwas:
Übrigens können Sie um mehr als 360 drehen wie:
quelle
Versuchen Sie es mit,
toDegrees="359"
da 360 ° und 0 ° gleich sind.quelle
Versuche dies.
quelle
Rotationsobjekt programmgesteuert.
// Drehung im Uhrzeigersinn:
// Drehung gegen den Uhrzeigersinn:
Ansicht ist ein Objekt Ihrer ImageView oder anderer Widgets.
rotate.setRepeatCount (10); Verwenden Sie diese Option, um Ihre Rotation zu wiederholen.
500 ist Ihre Animationszeitdauer.
quelle
Beschneiden des
<set>
Elements, das das Element umhüllt hat<rotate>
Element hat, löst das Problem!Danke an Shalafi!
Ihre Rotation_ccw.xml sollte also so aussehen:
quelle
Egal was ich versuchte, ich konnte dies nicht richtig zum Laufen bringen, indem ich Code (und setRotation) für eine reibungslose Rotationsanimation verwendete. Am Ende habe ich die Gradänderungen so klein gemacht, dass die kleinen Pausen nicht wahrgenommen werden. Wenn Sie nicht zu viele Umdrehungen ausführen müssen, ist die Zeit zum Ausführen dieser Schleife vernachlässigbar. Der Effekt ist eine gleichmäßige Rotation:
quelle
Wie hanry oben erwähnt hat, ist das Setzen des Liner-Iterpolators in Ordnung. Aber wenn die Rotation innerhalb eines Satzes liegt, müssen Sie android: shareInterpolator = "false" setzen, um es glatt zu machen.
Wenn Sharedinterpolator nicht falsch ist, gibt der obige Code Störungen.
quelle
Wenn Sie eine Set-Animation wie ich verwenden, sollten Sie die Interpolation innerhalb des Set-Tags hinzufügen:
Das hat bei mir funktioniert.
quelle
In Kotlin:
quelle
Ist es möglich, dass Sie, weil Sie von 0 auf 360 wechseln, etwas mehr Zeit bei 0/360 verbringen, als Sie erwarten? Vielleicht auf Grad auf 359 oder 358 setzen.
quelle
Versuchen Sie, mehr als 360 zu verwenden, um einen Neustart zu vermeiden.
Ich benutze 3600 insted von 360 und das funktioniert gut für mich:
quelle
Wenn Sie in Android ein Objekt animieren und von Objekt1 zu Standort2 verschieben möchten, ermittelt die Animations-API die Zwischenpositionen (Tweening) und stellt die entsprechenden Verschiebungsvorgänge zu den entsprechenden Zeiten mithilfe eines Timers in den Hauptthread . Dies funktioniert einwandfrei, außer dass der Haupt-Thread normalerweise für viele andere Dinge verwendet wird - Malen, Öffnen von Dateien, Reagieren auf Benutzereingaben usw. Ein Timer in der Warteschlange kann häufig verzögert werden. Gut geschriebene Programme versuchen immer, so viele Operationen wie möglich in Hintergrundthreads (nicht Hauptthreads) auszuführen. Sie können jedoch nicht immer vermeiden, den Hauptthread zu verwenden. Vorgänge, bei denen Sie ein UI-Objekt bearbeiten müssen, müssen immer im Hauptthread ausgeführt werden. Außerdem leiten viele APIs Operationen als eine Form der Thread-Sicherheit zurück zum Haupt-Thread.
Alle Ansichten werden auf demselben GUI-Thread gezeichnet, der auch für alle Benutzerinteraktionen verwendet wird.
Wenn Sie also die GUI schnell aktualisieren müssen oder wenn das Rendern zu lange dauert und die Benutzererfahrung beeinträchtigt, verwenden Sie SurfaceView.
Beispiel für ein Rotationsbild:
Aktivität:
quelle
quelle