87 votes

Android animation ne se répète pas

Je suis en train de faire une animation simple qui est répétée plusieurs fois (ou infini).
Il semble qu' android:repeatCount ne fonctionne pas!
Voici mon animation des ressources d' /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>

D'abord, il doit adapter l'image à partir de 1.0 à 1.2 taille de 500 ms.
Et puis à l'échelle de retour à 1,0 dans les 500 ms.
Voici comment je l'utilise:

Animation firstAnimation = AnimationUtils.loadAnimation(this, R.anim.first_animation);
imgView.startAnimation(firstAnimation);

Il fait un cycle, puis de finitions.
Il évolue ensuite échelles sna, puis s'arrête.

Comment puis-je faire ce travail comme prévu?

64voto

Turbo Points 2177

Mise à jour: de Retour dans la Sep, 2011 Android ingénieur résolu ce problème pour la plupart. Les attributs qui ont été ignorés dans XML travail, à l'exception de l' repeatCount et fillEnabled qui sont encore ignorés (sur le but pour une raison quelconque). Cela signifie qu'il n'est pas toujours facile de répéter un AnimationSet malheureusement.

Pour plus de détails, veuillez voir la vue d'ensemble dans la mise à jour des docs (explique quels sont les attributs sont ignorés, qui travaillent, et qui sont passés sur des enfants). Et pour une compréhension plus profonde de ce qu' fillAfter, fillBefore, et fillEnabled fait faire, à voir l'ingénieur (Chet Haase) blog post à ce sujet ici.


Réponse Originale À Cette Question

Développer des réponses par Pavel et d'autres: il est vrai que l' <set> balise est ridiculement buggy. Il ne peut pas traiter correctement avec repeatCount et un certain nombre d'autres attributs.

J'ai passé quelques heures à essayer de comprendre ce qu'il peut et ne peut pas traiter et ont soumis un rapport de bug/problème ici: Question 17662

En résumé (préoccupations AnimationSets):

setRepeatCount() / android:repeatCount

Cet attribut (ainsi que repeatMode) ne fonctionne pas dans le code ou XML. Cela fait de répéter un ensemble d'animations difficile.

setDuration() / android:durée

Réglage de ce paramètre sur une AnimationSet dans le code FONCTIONNE (remplace toutes les durées de des enfants animations), mais pas lorsqu'ils sont inclus dans la balise XML

setFillAfter() / android:fillAfter

Cela fonctionne dans les deux code et XML pour la balise. Étrangement, j'ai eu à le faire également de travailler sans la nécessité de mettre en fillEnabled de vrai.

setFillBefore() / android:fillBefore

Ne semble pas avoir d'effet/ignorés à la fois le code et XML

setFillEnabled() / android:fillEnabled

Ne semble pas avoir d'effet/ignorés à la fois le code et XML. Je peux encore faire fillAfter à travailler même sans y compris fillEnabled ou de réglage de fillEnabled à false.

setStartOffset() / android:startOffset

Cela ne fonctionne que dans le code et pas le XML.

51voto

Pavel Chernov Points 615

J'ai trouvé que <set> balise a buggy mise en œuvre dans la classe AnimationSet.
Il ne peut pas traiter correctement avec repeatCount.
Ce que nous pouvons faire est de définir repeatCount directement dans <échelle> balise.

Cette ressource XML fonctionne bien:

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

Malheureusement, c'est seulement limité à une animation à la fois.
Nous ne pouvons pas définir une séquence d'animations de cette façon...

41voto

Macumbaomuerte Points 505

Vous devez inclure l'attribut

android:repeatCount="infinite"

Mais dans votre "échelle" de l'animation n'est pas en "set"

32voto

Danuofr Points 489

Pour obtenir une répétition de l'animation j'ai utilisé l'animation à l'écoute, et a appelé de nouveau l'animation quand il a fini. Cela fonctionne un appareil photo réticule en se concentrant, comme l'animation avec des crochets.

Voici l'animation mise en page xml

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

Voici le code java

 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);
}

9voto

Informatics Points 115

vous pouvez tester ce code. Dans votre code juste ajouter,

firstAnimation.setRepeatCount(5);

Cette fonction permet de répéter l'animation pour une période de temps définie

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

Cette fonction permet de répéter l'animation indéfiniment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X