Soru Android animasyonu tekrarlanmıyor


Birkaç kez (veya sonsuz) tekrarlayan basit animasyonlar yapmaya çalışıyorum.
Öyle görünüyor android:repeatCount çalışmıyor!
İşte benim animasyon kaynağım /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>

İlk olarak, görüntüyü 500 ms'de 1.0'dan 1.2 boyutuna ölçeklendirmelidir.
Ve sonra 500 ms içinde 1.0'a geri ölçeklendirin.
Bunu nasıl kullanıyorum:

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

Bir döngü yapar ve sonra biter.
Yukarı ölçeklendirir, sonra ans aşağı ölçekler ve sonra durur.

Bu işi amaçlandığı şekilde nasıl yapabilirim?


76
2017-12-18 23:04


Menşei


Java kodunuzda imgView nedir? - clifgray


Cevaplar:


Güncelleştirme: Eylül 2011'de, bir Android mühendisi bu sorunu büyük ölçüde giderdi. XML'de yok sayılan özellikler artık istisna ile çalışıyor. repeatCount ve fillEnabled hala göz ardı edilen (bazı sebeplerden dolayı). Bu hala bir tekrarlamak kolay değil demektir AnimationSet ne yazık ki.

Ayrıntılar için lütfen güncellenmiş dokümanlar (Hangi niteliklerin göz ardı edildiğini, hangi işe yaradığını ve çocuklara aktarıldığını açıklar). Ve ne daha derin bir anlayış için fillAfter, fillBefore, ve fillEnabled Aslında, bu konuda mühendisin (Chet Haase) blog yazısı bakın İşte.


Orijinal cevap

Pavel ve diğerlerinin cevaplarını genişletmek için: <set> etiketi gülünç bir araba. Doğru olarak ele alınamıyor repeatCount ve diğer bir dizi özellik.

Neler yapabildiğini ve neyle başa çıkamadığını bulmak için birkaç saat harcadım ve burada bir hata raporu / sorunu gönderdim: Sayı 17662

Özetle (bu endişeler AnimationSets)

setRepeatCount () / android: repeatCount

Bu özellik (yanı sıra repeatMode) kod veya XML'de çalışmaz. Bu, tüm animasyon setlerini tekrarlamayı zorlaştırıyor.

setDuration () / android: süresi

Bunu bir AnimationSet kodunda WORKS'te ayarlama (tüm animasyon sürelerini geçersiz kılar), ancak XML etiketine dahil edilmediğinde

setFillAfter () / android: fillAfter

Bu, etiket için hem kod hem de XML'de çalışır. Garip bir şekilde, fillEnabled öğesini true değerine ayarlamaya gerek kalmadan çalışmam için aldım.

setFillBefore () / android: fillBefore

Hem kod hem de XML'de hiçbir etkisi / yok sayılır gibi görünüyor

setFillEnabled () / android: fillEnabled

Hem kod hem de XML'de hiçbir etkisi / yok sayılır. Yine de fillEnabled'ı dahil etmeden veya fillEnabled'ı false değdirmeden çalışmaya devam edebilirim.

setStartOffset () / android: startOffset

Bu, yalnızca XML'de değil, kodda çalışır.


62
2018-06-15 00:45





Bunu buldum <Set> etiketinde buggy uygulaması var AnimationSet.
Doğru olarak ele alınamıyor repeatCount.
Ne yapabiliriz - ayarlamaktır repeatCount doğrudan <Ölçek> etiket.

Bu XML kaynağı iyi çalışıyor:

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

Ne yazık ki, bu sadece aynı anda sadece bir animasyon ile sınırlıdır.
Bu şekilde bir animasyon dizisi tanımlayamıyoruz ...


41
2017-12-19 20:25



Bir sette 2 animasyon çalıştırıyorum ve bana herhangi bir sorun vermiyorlar. Lütfen hangi sorunun hakkında konuştuğunuzu söyleyin? hangi böcek? şu an 1.6 sdk üzerinde çalışıyor - AZ_


Özniteliği eklemelisiniz

android:repeatCount="infinite"

Ama "ölçek" animasyonunda "ayarlanmış" değil


38
2018-01-30 17:48



ama bu animasyonlar, bir öncekinin tamamlanmasını bekleyecek mi? Teşekkürler - filthy_wizard
evet benim için çalışıyor. - Ranjith Kumar
Teşekkürler, bu işe yaradı! Programlı olarak ayarlamak her ne sebepten dolayı olmadı. - cherry-wave
Teşekkürler! Bu çalıştı. Ama sürekli. Bunu her 5 saniyede bir söylemek mümkün mü? - d34th4ck3r


Tekrar eden bir animasyon almak için animasyon dinleyicisini kullandım ve bittiğinde animasyonu tekrar aradım. Bu, parantez içinde animasyon gibi odaklanan bir kamera retikülü yapar.

İşte animasyon düzeni 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>

İşte java kodu

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

30
2018-02-24 00:31



Doğru cevap olmalı. - Adam Varhegyi
Doğru cevap olmalı. Tüm cihaz ve işletim sistemi seviyesinde çalışmak - Smeet
Bu bana da yardımcı oldu ama bu iki satırı Son yöntemden kaldırdım Animasyon anim = AnimationUtils.loadAnimation (BuzzFinderActivity.this, R.anim.crosshair_focusing); anim.setAnimationListener (bu); - aida


Aynı sorunla da karşı karşıyaydım. Ben android dahil: XMl dosyasında repeatCount = "sonsuz" .. onun iyi çalışıyor ...

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

 


10
2018-05-24 10:28





Bu kodu deneyebilirsiniz. Kodunuzda sadece ekleyin,

firstAnimation.setRepeatCount(5);

Bu, animasyonu belirli bir süre için tekrar edecektir

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

Bu animasyonu süresiz olarak tekrar edecektir.


9
2017-12-30 04:17



repeatMode ya olmalı RESTART veya REVERSE - xinthink
Tam olarak istediğim şey, sonsuza dinamik olarak ayarlanmış. - Varun Chaudhary
setRepeat çalışmıyor code.google.com/p/android/issues/detail?id=17662 - ElliotM


Animasyonun tam sayısını göstermek için Daniel'in kodunu kullanmaya çalıştım ve bir problem yaşadım: Animasyon n / 2 kat, n zaman beklendiğinde yaklaşık olarak gösterildi.

Bu yüzden Daniel'in kodunu değiştirdim:

//...
@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);
            }
        }  
    } 
}
//... 

Yukarıda gösterilen varyantı kullanarak, animasyon, REPEAT_COUNT kez tam olarak gösterilir; çünkü View.post () yöntemi, önceki animasyonla ilgili tüm işlemleri tamamladıktan sonra yeni animasyon başlatma olanağı sağlar.


2
2017-12-28 04:48





Android sdk sürümü 4.0.3 ile:

Verilen animasyon öğelerinde:

android: repeatCount = "- 1"

onu sonsuz bir animasyon yapar.


2
2018-01-11 08:49



Teşekkürler! Herhangi bir geçici çözüm olmadan 4.2'de iyi çalışıyor - ruX


Aşağıdaki sınıfı projenize ekleyin:

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

Görünümünüzün sonsuz döngüsü için şunları yapın:

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

Animasyonu yalnızca N-kez için tekrarlamak isterseniz, aşağıdakileri yapın:

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

N tekrar sayısıdır.


2
2017-08-19 13:53