Ich versuche, eine einfache Animation zu erstellen, die sich mehrmals (oder unendlich) wiederholt.
Es scheint, dass android:repeatCount
das nicht funktioniert!
Hier ist meine Animationsressource von /res/anim/first_animation.xml
:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:repeatCount="infinite"
>
<scale
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="500"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="1.2"
android:toYScale="1.2"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false" />
<scale
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="500"
android:duration="500"
android:fromXScale="1.2"
android:fromYScale="1.2"
android:toXScale="1.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false" />
</set>
Zuerst sollte das Bild in 500 ms von 1,0 auf 1,2 skaliert werden.
Und skalieren Sie es dann in 500 ms auf 1,0 zurück.
So benutze ich es:
Animation firstAnimation = AnimationUtils.loadAnimation(this, R.anim.first_animation);
imgView.startAnimation(firstAnimation);
Es macht einen Zyklus und endet dann.
Es skaliert nach oben, dann nach unten und stoppt dann.
Wie kann ich diese Arbeit wie beabsichtigt machen?
Antworten:
Update: Bereits im September 2011 hat ein Android-Ingenieur dieses Problem größtenteils behoben. Die Attribute, die in XML ignoriert wurden, funktionieren jetzt, mit Ausnahme von
repeatCount
undfillEnabled
die immer noch ignoriert werden (absichtlich aus irgendeinem Grund). Dies bedeutet, dass esAnimationSet
leider immer noch nicht einfach ist, eine zu wiederholen .Einzelheiten finden Sie in der Übersicht in den aktualisierten Dokumenten (erläutert, welche Attribute ignoriert werden, welche funktionieren und welche an untergeordnete Elemente übergeben werden). Und für ein tieferes Verständnis dessen
fillAfter
, wasfillBefore
und wasfillEnabled
tatsächlich zu tun ist, lesen Sie hier den Blog-Beitrag des Ingenieurs (Chet Haase) darüber .Ursprüngliche Antwort
Um die Antworten von Pavel und anderen zu erweitern: Es ist wahr, dass das
<set>
Tag lächerlich fehlerhaft ist. Es kann nicht richtig mitrepeatCount
und einer Reihe anderer Attribute umgehen .Ich habe ein paar Stunden damit verbracht herauszufinden, was es kann und was nicht und habe hier einen Fehlerbericht / ein Problem eingereicht: Ausgabe 17662
Zusammenfassend (dies betrifft
AnimationSet
s):quelle
Ich habe festgestellt, dass das <set> -Tag eine fehlerhafte Implementierung in der Klasse AnimationSet hat .
Es kann nicht richtig mit repeatCount umgehen .
Was wir tun können, ist, repeatCount direkt im <scale> -Tag festzulegen .
Diese XML-Ressource funktioniert gut:
Leider ist dies auf nur eine Animation gleichzeitig beschränkt.
Auf diese Weise können wir keine Folge von Animationen definieren ...
quelle
Sie sollten das Attribut einschließen
Aber in Ihrer "Skala" Animation nicht in "Set"
quelle
Um eine sich wiederholende Animation zu erhalten, habe ich den Animations-Listener verwendet und die Animation am Ende erneut aufgerufen. Dies führt zu einem Kamera-Fadenkreuz, das wie eine Animation mit Klammern fokussiert.
Hier ist das XML-Animationslayout
Hier ist der Java-Code
quelle
Ich hatte auch das gleiche Problem .. ich habe android: repeatCount = "infinite" in die XMl-Datei aufgenommen .. jetzt funktioniert es gut ...
quelle
Sie können diesen Code ausprobieren. Fügen Sie in Ihrem Code einfach Folgendes hinzu:
Dadurch wird die Animation für eine bestimmte Zeit wiederholt
Dadurch wird die Animation auf unbestimmte Zeit wiederholt.
quelle
repeatMode
sollte entwederRESTART
oderREVERSE
Ich habe versucht, Daniels Code zu verwenden, um die Animation genau so oft anzuzeigen, und hatte ein Problem: Die Animation wurde ungefähr n / 2 Mal angezeigt, wenn n Mal erwartet.
Also habe ich Daniels Code geändert:
Bei Verwendung der oben gezeigten Variante wird die Animation genau REPEAT_COUNT-mal angezeigt, da die View.post () -Methode die Möglichkeit bietet, eine neue Animation zu starten, nachdem alle Aktionen abgeschlossen wurden, die mit der vorherigen Animation zusammenhängen.
quelle
Sie müssen nur eine Zeile in Ihren XML-Code einfügen, die ich unten vorgeschlagen habe.
quelle
Mit Android SDK Version 4.0.3:
In den angegebenen Animationselementen:
android: repeatCount = "- 1"
macht es zu einer unendlichen Animation.
quelle
Fügen Sie Ihrem Projekt die folgende Klasse hinzu:
Gehen Sie für eine Endlosschleife Ihrer Ansicht wie folgt vor:
Wenn Sie die Animation nur N-mal wiederholen möchten, gehen Sie wie folgt vor:
N steht für Anzahl der Wiederholungen.
quelle
Ich habe dieses Problem
android:repeatMode="reverse"
zuvor in meinem Projekt gelöst .quelle
Ich mache die meisten meiner Sachen programmgesteuert und bin vielleicht zu spät oder ineffizient, aber dies, aber ich habe das Ziel des Wiederholungsanimationssatzes erreicht (ich habe sogar 2 abwechselnde Animationssätze). Dieser Code blendet lediglich ein Bild ein, hält an, blendet dann aus, blendet ein anderes Bild ein, hält an, blendet aus und bringt das erste Bild zurück (spülen und wiederholen). Ich habe zuerst meine Bildansichten definiert:
Dann habe ich zwei Timer, Task-Timer und Handler erstellt, um festzulegen, wann jede Animation gestartet und gestoppt werden soll:
Anstatt Animationssets durch Hinzufügen von Animationen zu erstellen, habe ich nur Animations-Listener, um zu bestimmen, wann jede Animation gestartet werden soll:
Die Clearanimation und Ungültigmachung, wo gerade vorherige Versuche und das Ding richtig funktionieren lassen. Ich weiß nicht, ob sie benötigt werden oder nicht.
Hoffe das hilft jemandem.
Ryan
quelle
Ich habe es geschafft ... Ich habe versucht, eine Ansicht zu bekommen, die sich kontinuierlich im Kreis dreht.
Vorher habe ich Rotation.setRepeatMode (-1) verwendet, aber das hat nicht funktioniert. auf setrepeatcount umgestellt und es funktioniert. Dies ist auf Jelly Bean 4.2.2
quelle
Ich hatte das gleiche Problem, wollte aber in Java keine Timing-Dinge tun, da der UI-Thread manchmal sehr beschäftigt sein kann. Das INFINITE-Flag funktioniert nicht für das Set-Tag. Also habe ich das Problem mit einem kleinen Stück Code gelöst:
mit folgendem XML:
Wobei mIcon eine ImageView aus meinem Layout ist.
quelle
Ich habe dieses Problem gelöst. Dies ist meine Version des Fixes:
quelle
Ich bin gerade auf dieses Problem gestoßen, als ich an einer abwärtskompatiblen App gearbeitet habe. so frustrierend! Am Ende habe ich eine nette Workaround-Klasse codiert, die von onCreate aufgerufen werden kann und jede Animationsressource in eine unbestimmte Schleife versetzt.
Die Klasse AnimationLooper ist hier verfügbar: https://gist.github.com/2018678
quelle
Nachdem ich die Antworten aus dem Internet recherchiert hatte, fand ich eine Lösung, die perfekt für mich funktioniert. (Und ja, repeatCount und repeatMode sind in Verbindung mit animationSet extrem fehlerhaft).
anim_rotate_fade.xml:
In Aktivität: (Lösen Sie es, indem Sie nach dem Ende der Animation eine leichte Verzögerung einführen.)
Es gibt viele Klassen, an denen Sie gerne recherchieren möchten, aber derzeit verwende ich objectAnimator, das sehr flexibel ist. Ich würde nicht empfehlen, Animation oder AnimationUtils zu verwenden:
quelle
Sie müssen auf den Abschluss der ersten Animation warten und dann die Animation in onStopAnimation erneut starten. Rufen Sie diesen Link auf
quelle
Kleine Änderung an der Antwort von @Danufr, um zu verhindern, dass Ressourcen erneut geladen werden.
quelle
Ich habe dieses Problem mit Thread gelöst.
quelle
es funktioniert gut
quelle
Keine der oben genannten Lösungen hat in meinem Fall funktioniert. Die Lösung von Danuofr funktionierte für Animationssets, aber als ich Unit-Tests durchführte, blieben meine Tests in dieser Endlosschleife stecken. Schließlich musste ich diese Animation speziell für meinen Fall so oft wiederholen. Daher habe ich manuell Kopien meiner Animation in anim_rot.xml kaskadiert hinzugefügt und den Versatzwert hinzugefügt . Ich weiß, dass es schlecht ist und für viele nicht funktioniert, aber es war die einzige Problemumgehung für meinen Fall.
anim_rot.xml
Ich habe dies getan, um die Animation dreimal zu wiederholen. Sie können weitere Kopien hinzufügen, um sie zu bestimmten Zeiten zu wiederholen, indem Sie Versatzwerte hinzufügen.
quelle
Versuchen Sie, den Code einem Schleifen-Thread oder einer while / for-Anweisung hinzuzufügen
quelle