Android-Animation wird nicht wiederholt

84

Ich versuche, eine einfache Animation zu erstellen, die sich mehrmals (oder unendlich) wiederholt.
Es scheint, dass android:repeatCountdas 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?

Pavel Chernov
quelle
Was ist imgView hier in Ihrem Java-Code?
Clifgray

Antworten:

63

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 repeatCountund fillEnableddie immer noch ignoriert werden (absichtlich aus irgendeinem Grund). Dies bedeutet, dass es AnimationSetleider 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, was fillBeforeund was fillEnabledtatsä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 mit repeatCountund 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 AnimationSets):

setRepeatCount () / android: repeatCount

Dieses Attribut (sowie repeatMode) funktioniert nicht in Code oder XML. Dies erschwert das Wiederholen einer ganzen Reihe von Animationen.

setDuration () / android: Dauer

Wenn Sie dies in einem AnimationSet in Code WORKS festlegen (überschreibt alle Dauern von untergeordneten Animationen), jedoch nicht, wenn es in dem Tag in XML enthalten ist

setFillAfter () / android: fillAfter

Dies funktioniert sowohl in Code als auch in XML für das Tag. Seltsamerweise habe ich es auch zum Laufen gebracht, ohne dass fillEnabled auf true gesetzt werden muss.

setFillBefore () / android: fillBefore

Scheint keine Auswirkungen zu haben / wird sowohl in Code als auch in XML ignoriert

setFillEnabled () / android: fillEnabled

Scheint keine Auswirkungen zu haben / wird sowohl in Code als auch in XML ignoriert. Ich kann fillAfter immer noch zum Arbeiten bringen, auch ohne fillEnabled einzuschließen oder fillEnabled auf false zu setzen.

setStartOffset () / android: startOffset

Dies funktioniert nur in Code und nicht in XML.

Tony Chan
quelle
47

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:

<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:duration="200"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="1.05"
    android:toYScale="1.05"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatMode="reverse"
    android:fillAfter="false"
    android:repeatCount="24"
/>

Leider ist dies auf nur eine Animation gleichzeitig beschränkt.
Auf diese Weise können wir keine Folge von Animationen definieren ...

Pavel Chernov
quelle
Ich führe 2 Animationen in einem Set aus und sie geben mir kein Problem. Sagen Sie mir bitte, über welches Problem Sie sprechen. Welcher Fehler? arbeitet derzeit an 1.6 sdk
AZ_
Das Deklarieren von repeatCount in XML funktioniert, aber nicht im Code
onmyway133
39

Sie sollten das Attribut einschließen

android:repeatCount="infinite"

Aber in Ihrer "Skala" Animation nicht in "Set"

Macumbaomuerte
quelle
1
Aber werden diese Animationen warten, bis die vorhergehende abgeschlossen ist? danke
filthy_wizard
Danke, das hat funktioniert! Das programmgesteuerte Einstellen war aus irgendeinem Grund nicht möglich.
Kirschwelle
Vielen Dank! Das hat funktioniert. Aber es ist kontinuierlich. Ist es möglich, dies etwa alle 5 Sekunden zu erreichen?
d34th4ck3r
32

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

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
    android:fromXScale="1.0"
    android:toXScale=".7"
    android:fromYScale="1.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toYScale=".7"
    android:duration="1000"/>
<scale 
    android:duration="1000"
    android:fromXScale=".7"
    android:toXScale="1.0"
    android:fromYScale=".7"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toYScale="1.0"
    android:startOffset="1000"/>

</set>

Hier ist der Java-Code

 public void startAnimation() {

            View brackets = findViewById(R.id.brackets);
            brackets.setVisibility(View.VISIBLE);

            Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
            anim.setAnimationListener(new AnimationListener() {

                @Override
                public void onAnimationEnd(Animation arg0) {
                    Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
                    anim.setAnimationListener(this);
                    brackets.startAnimation(anim);

                }

                @Override
                public void onAnimationRepeat(Animation arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onAnimationStart(Animation arg0) {
                    // TODO Auto-generated method stub

                }

            });


            brackets.startAnimation(anim);
}
Danuofr
quelle
2
Ja, es sollte die richtige Antwort sein. Arbeiten in allen Geräte- und Betriebssystemebenen
Smeet
es hat mir auch geholfen, aber ich habe diese beiden Zeilen aus der End-Methode entfernt. Animation anim = AnimationUtils.loadAnimation (BuzzFinderActivity.this, R.anim.crosshair_focusing); anim.setAnimationListener (this);
Aida
10

Ich hatte auch das gleiche Problem .. ich habe android: repeatCount = "infinite" in die XMl-Datei aufgenommen .. jetzt funktioniert es gut ...

  <translate 
           android:fromXDelta="0"
           android:toXDelta="80"
           android:duration="1000"
           android:repeatCount="infinite"   
           android:repeatMode="reverse" 
           android:pivotX="50%"
           android:pivotY="50%"                             
           android:fillAfter="true"/>

abhilash
quelle
9

Sie können diesen Code ausprobieren. Fügen Sie in Ihrem Code einfach Folgendes hinzu:

firstAnimation.setRepeatCount(5);

Dadurch wird die Animation für eine bestimmte Zeit wiederholt

firstAnimation.setRepeatCount(Animation.INFINITE);
firstAnimation.setRepeatMode(Animation.INFINITE);

Dadurch wird die Animation auf unbestimmte Zeit wiederholt.

Informatik
quelle
4
repeatModesollte entweder RESTARToderREVERSE
xinthink
das ist genau das, was ich will, auf dynamisch auf unendlich setzen.
Varun Chaudhary
2
setRepeat funktioniert nicht gemäß code.google.com/p/android/issues/detail?id=17662
ElliotM
3

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:

//...
@Override
public void onAnimationEnd(Animation arg0) {
    mCurrentCount++;
    if (mCurrentCount < REPEAT_COUNT) {  
        Animation anim = AnimationUtils.loadAnimation(BuzzFinderActivity.this, R.anim.crosshair_focusing);
        anim.setAnimationListener(this);
        brackets.post(new Runnable() {
            @Override
            public void run() {
                brackets.startAnimation(anim);
            }
        }  
    } 
}
//... 

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.

Denis
quelle
3

Sie müssen nur eine Zeile in Ihren XML-Code einfügen, die ich unten vorgeschlagen habe.

<scale
    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:repeatCount="infinite" // just add this one line 
    android:fillAfter="false"
    />
</set>
Mitesh Sawant
quelle
2

Mit Android SDK Version 4.0.3:

In den angegebenen Animationselementen:

android: repeatCount = "- 1"

macht es zu einer unendlichen Animation.

Kurt Junghanns
quelle
Vielen Dank! Es funktioniert gut auf 4.2 ohne
Problemumgehung
2

Fügen Sie Ihrem Projekt die folgende Klasse hinzu:

import android.view.View;
import android.view.animation.Animation;

public class AnimationRepeater implements Animation.AnimationListener
{
    private View view;
    private Animation animation;
    private int count;

    public AnimationRepeater(View view, Animation animation)
    {
        this.view = view;
        this.animation = animation;
        this.count = -1;
    }

    public AnimationRepeater(View view, Animation animation, int count)
    {
        this.view = view;
        this.animation = animation;
        this.count = count;
    }

    public void start()
    {
        this.view.startAnimation(this.animation);
        this.animation.setAnimationListener(this);
    }

    @Override
    public void onAnimationStart(Animation animation) { }

    @Override
    public void onAnimationEnd(Animation animation)
    {
        if (this.count == -1)
            this.view.startAnimation(animation);
        else
        {
            if (count - 1 >= 0)
            {
                this.animation.start();
                count --;
            }
        }
    }

    @Override
    public void onAnimationRepeat(Animation animation) { }
}

Gehen Sie für eine Endlosschleife Ihrer Ansicht wie folgt vor:

Animation a = AnimationUtils(Context, R.anim.animation);
new AnimationRepeater(View, a).start();

Wenn Sie die Animation nur N-mal wiederholen möchten, gehen Sie wie folgt vor:

Animation a = AnimationUtils(Context, R.anim.animation);
new AnimationRepeater(View, a, int N).start();

N steht für Anzahl der Wiederholungen.

domi
quelle
2

Ich habe dieses Problem android:repeatMode="reverse"zuvor in meinem Projekt gelöst .

<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:repeatMode="reverse"
    android:repeatCount="infinite" />
Huseyin
quelle
1

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:

    final ImageView purple = (ImageView)findViewById(R.id.purp);
    final ImageView yellow = (ImageView)findViewById(R.id.yell);
    purple.setVisibility(View.INVISIBLE);
    yellow.setVisibility(View.INVISIBLE);

Dann habe ich zwei Timer, Task-Timer und Handler erstellt, um festzulegen, wann jede Animation gestartet und gestoppt werden soll:

    Timer p = new Timer();
    TimerTask pu = new TimerTask() {
        public void run() {
                handler1.post(new Runnable() {
                        public void run() 
                        {
                           fadein(purple);
                        }
               });
        }};
        p.schedule(pu, 6000, 12000);

    final Handler handler2 = new Handler();

    Timer y = new Timer();
    TimerTask ye = new TimerTask() {
        public void run() {
                handler2.post(new Runnable() {
                        public void run() 
                        {
                           fadein(yellow);
                        }
               });
        }};

        y.schedule(ye, 0, 12000);

Anstatt Animationssets durch Hinzufügen von Animationen zu erstellen, habe ich nur Animations-Listener, um zu bestimmen, wann jede Animation gestartet werden soll:

public void fadein (final ImageView image)
{
    Animation anim = new AlphaAnimation(0, 1);

    anim.setDuration(2000);

    image.startAnimation(anim);
    anim.setAnimationListener(new AnimationListener() {
        public void onAnimationEnd(Animation animation) 
        {
            image.clearAnimation();
            image.invalidate();
            pause(image);

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }
    });
}    
public void pause (final ImageView image)
{
    Animation anim = new AlphaAnimation(1, 1);

    anim.setDuration(2000);

    image.startAnimation(anim);
    anim.setAnimationListener(new AnimationListener() {
        public void onAnimationEnd(Animation animation) 
        {
            image.clearAnimation();
            image.invalidate();
            fadeout(image);

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }
    });
}     
public void fadeout (final ImageView image)
{
    Animation anim = new AlphaAnimation(1,0);

    anim.setDuration(2000);

    image.startAnimation(anim);
    anim.setAnimationListener(new AnimationListener() {
        public void onAnimationEnd(Animation animation) 
        {
            image.clearAnimation();
            image.invalidate();
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }
    });
}    

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

Testingtester
quelle
1

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

 ObjectAnimator rotation = ObjectAnimator.ofFloat(myview,
                          "rotation", 360).setDuration(2000);
                rotation.setRepeatMode(-1);
          rotation.setRepeatCount(Animation.INFINITE); 
 rotation.start();
j2emanue
quelle
0

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:

mAnimation = (AnimationSet) AnimationUtils.loadAnimation(myContext, R.anim.blink);
mIcon.startAnimation(mAnimation);
mAnimation.setAnimationListener(new AnimationListener() {
    public void onAnimationStart(Animation animation) {}
    public void onAnimationRepeat(Animation animation) {}
    public void onAnimationEnd(Animation animation) {
        mIcon.startAnimation(mAnimation);
    }
});

mit folgendem XML:

<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />

<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromAlpha="0.9"
    android:startOffset="1000"
    android:toAlpha="0.0" />

Wobei mIcon eine ImageView aus meinem Layout ist.

Jordi
quelle
0

Ich habe dieses Problem gelöst. Dies ist meine Version des Fixes:

public class HelloAndroidActivity extends Activity {
private static String TAG = "animTest";
private Animation scaleAnimation;
private int currentCover = 0;
private List<ImageView> imageViews = new ArrayList<ImageView>(3);
private Button btn;
private ImageView img;

/**
 * Called when the activity is first created.
 * @param savedInstanceState If the activity is being re-initialized after 
 * previously being shut down then this Bundle contains the data it most 
 * recently supplied in onSaveInstanceState(Bundle). <b>Note: Otherwise it is null.</b>
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate");
    setContentView(R.layout.test);

    img = (ImageView)findViewById(R.id.testpict);
    imageViews.add(img);
    img = (ImageView)findViewById(R.id.testpictTwo);
    imageViews.add(img);
    img = (ImageView)findViewById(R.id.testpict3);
    imageViews.add(img);

    scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.photo_scale);
    scaleAnimation.setAnimationListener(new CyclicAnimationListener());

    btn = (Button)findViewById(R.id.startBtn);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            imageViews.get(0).startAnimation(scaleAnimation);
        }
    });



}

private class CyclicAnimationListener implements AnimationListener{

    @Override
    public void onAnimationEnd(Animation animation) {
        currentCover += 1;
        if(currentCover >= imageViews.size()){
            currentCover = 0;
        }
        img = imageViews.get(currentCover);
        scaleAnimation = AnimationUtils.loadAnimation(HelloAndroidActivity.this, R.anim.photo_scale);
        scaleAnimation.setAnimationListener(new CyclicAnimationListener());
        img.startAnimation(scaleAnimation);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        Log.d("Animation", "Repeat");
    }

    @Override
    public void onAnimationStart(Animation animation) {

    }

}

}
xander_blr
quelle
0

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

Newbyca
quelle
0

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:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:ordering="together" >

    <objectAnimator
        android:duration="3000"
        android:propertyName="rotation"
        android:repeatCount="1"
        android:valueTo="360"
        android:valueType="floatType" />

    <objectAnimator
        android:duration="3000"
        android:propertyName="alpha"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:valueFrom="0.0"
        android:valueTo="0.3"
        android:valueType="floatType" />

    <objectAnimator
        android:duration="3000"
        android:propertyName="y"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:valueFrom="380"
        android:valueTo="430"
        android:valueType="floatType" />

</set>

In Aktivität: (Lösen Sie es, indem Sie nach dem Ende der Animation eine leichte Verzögerung einführen.)

ImageView starlightImageView = new ImageView(this);
starlightImageView.setImageResource(R.drawable.starlight);
final AnimatorSet animate = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.anim.anim_rotate_fade);
AnimatorListenerAdapter animatorListener = new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                animate.start();
            }
        }, 1000);
    }
};
animate.setTarget(starlightImageView);
animate.addListener(animatorListener);

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:

  • Animation
  • AnimationUtils
  • Animator
  • AnimatorInflater
  • AnimatorListener
  • AnimatorListenerAdapter
morph85
quelle
0

Sie müssen auf den Abschluss der ersten Animation warten und dann die Animation in onStopAnimation erneut starten. Rufen Sie diesen Link auf

Ravi K. Sharma
quelle
0

Kleine Änderung an der Antwort von @Danufr, um zu verhindern, dass Ressourcen erneut geladen werden.

    operator = (ImageView) findViewById(R.id.operator_loading);
  final  Animation ani = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.finding_operator);


    ani.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {

            operator.startAnimation(ani);

        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });

    operator.setAnimation(ani);
Herr Coder
quelle
0

Ich habe dieses Problem mit Thread gelöst.

Button btn = (Button) findViewById(R.id.buttonpush);
    final TextView textview = (TextView) findViewById(R.id.hello);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            textview.setText("...................");
            final Animation animationtest = AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.slide_in_left);
            animationtest.setDuration(1000);

            final Handler handler = new Handler();
            Runnable runnable = new Runnable() {
                public void run() {
                    handler.postDelayed(this, 1500);
                    textview.startAnimation(animationtest);
                }
            };
            handler.postDelayed(runnable, 500); // start
            handler.removeCallbacks(runnable); //STOP Timer

        }
    });
nikeru8
quelle
0

es funktioniert gut

 GifDrawable gifDrawable = (GifDrawable) gifImageView.getDrawable();
    gifDrawable.setLoopCount(0);
BHAVIK PANCHAL
quelle
0

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

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="2000"
        android:fromDegrees="20"
        android:pivotX="29%"
        android:pivotY="50%"
        android:toDegrees="-20" />
    <rotate
        android:duration="2000"
        android:fromDegrees="-20"
        android:pivotX="29%"
        android:pivotY="53%"
        android:startOffset="2000"
        android:toDegrees="20" />
    <rotate
        android:startOffset="4000"
        android:duration="2000"
        android:fromDegrees="20"
        android:pivotX="29%"
        android:pivotY="56%"
        android:toDegrees="-20" />
    <rotate
        android:duration="2000"
        android:fromDegrees="-20"
        android:pivotX="29%"
        android:pivotY="59%"
        android:startOffset="6000"
        android:toDegrees="20" />
    <rotate
        android:startOffset="8000"
        android:duration="2000"
        android:fromDegrees="20"
        android:pivotX="29%"
        android:pivotY="62%"
        android:toDegrees="-20" />
    <rotate
        android:duration="2000"
        android:fromDegrees="-20"
        android:pivotX="29%"
        android:pivotY="65%"
        android:startOffset="10000"
        android:toDegrees="20" />
</set>

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.

Sachin Aggarwal
quelle
-1

Versuchen Sie, den Code einem Schleifen-Thread oder einer while / for-Anweisung hinzuzufügen

carefacerz
quelle
Die einzige Lösung, die ich gefunden habe, besteht darin, die Verwendung von Set-Tags zu vermeiden.
Pavel Chernov