Android animasyonu tekrar etmiyor


85

Birkaç kez (veya sonsuza kadar) tekrar eden basit animasyonlar yapmaya çalışıyorum.
Görünüşe göre bu android:repeatCountişe yaramıyor!
İşte 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'ye ölçeklendirmelidir.
Ve sonra bunu 500 ms'de 1.0'a ölçekleyin.
İşte bunu nasıl kullanıyorum:

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

Bir döngü yapar ve sonra biter.
Ölçek büyür, sonra ölçeği küçültür ve sonra durur.

Bunun amaçlandığı gibi çalışmasını nasıl sağlayabilirim?


Java kodunuzda burada imgView nedir?
clifgray

Yanıtlar:


63

Güncelleme: Eylül 2011'de bir Android mühendisi bu sorunu büyük ölçüde düzeltti. XML'de göz ardı edilen öznitelikler, hariç repeatCountve fillEnabledhala göz ardı edilen (bazı nedenlerden dolayı kasıtlı olarak) artık çalışıyor . Bu, AnimationSetmaalesef yine de tekrar etmenin kolay olmadığı anlamına gelir .

Ayrıntılar için lütfen güncellenmiş belgelerdeki genel bakışa bakın (hangi özelliklerin göz ardı edildiğini, hangi çalışmayı ve hangilerinin çocuklara aktarıldığını açıklar). Ve daha derin bir anlayış için fillAfter, fillBeforeve fillEnabledaslında yapmak, bu konuda mühendisin (Chet Haase) blog yazısı bakınız burada .


Orijinal Cevap

Pavel ve diğerlerinin cevaplarını genişletmek gerekirse: <set>etiketin gülünç bir şekilde hatalı olduğu doğrudur . Doğru repeatCountve bir dizi başka özelliklerle başa çıkamaz .

Neyle başa çıkıp neyle başa çıkamayacağını bulmak için birkaç saat harcadım ve buraya bir hata raporu / sorun gönderdim: Sayı 17662

Özetle (bu, aşağıdakilerle ilgilidir AnimationSet):

setRepeatCount () / android: tekrarCount

Bu öznitelik (aynı zamanda againMode) kodda veya XML'de çalışmaz. Bu, bir dizi animasyonun tekrarlanmasını zorlaştırır.

setDuration () / android: süre

Bunu bir AnimationSet in code WORKS'te ayarlama (tüm alt animasyon sürelerini geçersiz kılar), ancak XML'deki etikete dahil edildiğinde değil

setFillAfter () / android: fillAfter

Bu, etiket için hem kodda hem de XML'de çalışır. Garip bir şekilde fillEnabled'ı true olarak ayarlamaya gerek kalmadan da çalışmasını sağladım.

setFillBefore () / android: fillBefore

Hem kodda hem de XML'de etkisi yok / yok sayılmış görünüyor

setFillEnabled () / android: fillEnabled

Hem kodda hem de XML'de etkisi yok / yok sayılmış görünüyor. FillEnabled dahil etmeden veya fillEnabled'ı false olarak ayarlamadan bile fillAfter çalışmaya devam edebilirim.

setStartOffset () / android: startOffset

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


48

<set> etiketinin AnimationSet sınıfında hatalı uygulaması olduğunu buldum . TekrarlaCount
ile doğru şekilde başa çıkamaz . Yapabileceğimiz şey - repreCount'u doğrudan <scale> etiketinde ayarlamaktır. 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 aynı anda yalnızca bir animasyonla sınırlıdır.
Bu şekilde bir dizi animasyon tanımlayamayız ...


Bir sette 2 animasyon çalıştırıyorum ve bana sorun çıkarmıyorlar. lütfen bana hangi sorundan bahsettiğini söyle? hangi böcek? şu anda 1.6 sdk üzerinde çalışıyor
AZ_


39

Özniteliği eklemelisiniz

android:repeatCount="infinite"

Ama senin "ölçek" animasyonunda "sette" değil


1
ancak bu animasyonlar bir öncekinin tamamlanmasını bekleyecek mi? teşekkürler
filthy_wizard

Teşekkürler, bu işe yaradı! Programatik olarak ayarlamak herhangi bir nedenle olmadı.
kiraz dalgası

Teşekkürler! Bu işe yaradı. Ama süreklidir. Bunun her 5 saniyede bir söylenmesi mümkün mü?
d34th4ck3r

32

Tekrar eden bir animasyon elde etmek için animasyon dinleyicisini kullandım ve bittiğinde animasyonu tekrar çağırdım. Bu, köşeli parantezli 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);
}

2
Ya doğru cevap olmalı. Tüm cihazlarda ve işletim sistemi seviyesinde çalışıyor
Smeet

bana da yardımcı oldu ama bu iki satırı End method Animation anim = AnimationUtils.loadAnimation (BuzzFinderActivity.this, R.anim.crosshair_focusing); anim.setAnimationListener (bu);
aida

10

Ben de aynı problemle karşı karşıyaydım .. XMl dosyasına android: tekrarCount = "sonsuz" ekledim..şimdi 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"/>


9

bu kodu deneyebilirsiniz. Kodunuza şunu ekleyin:

firstAnimation.setRepeatCount(5);

Bu, animasyonu belirli bir süre tekrarlayacaktır.

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

Bu, animasyonu süresiz olarak tekrarlayacaktır.


4
repeatModeRESTARTveya olmalıdırREVERSE
xinthink

tam olarak istediğim şey bu, dinamik olarak sonsuza ayarlı.
Varun Chaudhary


4

Daniel'in kodunu, animasyonu tam olarak göstermek için kullanmayı denedim ve bir sorunla karşılaştım: animasyon, n kez beklendiğinde yaklaşık olarak n / 2 kez gösterildi.

Ben de 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 tam olarak REPEAT_COUNT kez gösterilir, çünkü View.post () yöntemi, önceki animasyonla ilgili tüm eylemleri bitirdikten sonra yeni animasyonu başlatma yeteneği verir.


3

xml kodunuza aşağıda önerdiğim tek bir satır eklemelisiniz.

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

3

Bu problemi daha android:repeatMode="reverse"önce projemde kullanarak çözdüm.

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

2

Android SDK sürüm 4.0.3 ile:

Verilen animasyon öğelerinde:

android: tekrarCount = "- 1"

onu sonsuz bir animasyon yapar.


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

2

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 aşağıdakileri yapın:

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

Animasyonu yalnızca N kez tekrarlamak istiyorsanız, aşağıdakileri yapın:

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

N, tekrar sayısı anlamına gelir.


1

İşlerimin çoğunu programlı olarak yapıyorum ve bu konuda gecikebilirim veya verimsiz olabilirim ama bu, animasyon setini tekrarlama hedefini tamamladım (hatta 2 alternatif animasyon setim var). Bu kodun yaptığı tek şey basitçe bir görüntüde solmak, duraklatmak, sonra kararmak, başka bir görüntüde solmak, duraklatmak, karartmak ve ilkini geri getirmek (durulayın ve tekrarlayın). Önce Görüntü Görünümlerimi tanımladım:

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

Sonra, her animasyonun ne zaman başlatılıp durdurulacağını belirlemek için iki zamanlayıcı, görev zamanlayıcıları ve işleyiciler yaptım:

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

Son olarak, animasyonlar ekleyerek animasyon setleri oluşturmak yerine, her animasyonun ne zaman başlatılacağını belirlemek için sadece animasyon dinleyicileri:

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

        }
    });
}    

Netleştirme ve daha önceki denemelerde geçersiz kılma ve bu şeyin doğru çalışmasını sağlama. Gerekli olup olmadıklarını bilmiyorum.

Umarım bu birine yardımcı olur.


Ryan


1

Bunu hallettim ... Sürekli bir daire içinde dönecek bir görünüm elde etmeye çalışıyordum.

önceki rotation.setRepeatMode (-1) kullanıyordum ama işe yaramadı. setrepeatcount'a geçti ve çalışıyor. Bu jelibon 4.2.2 üzerindedir

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

0

Aynı sorunla karşılaştım, ancak Java'da zamanlama yapmak istemedim çünkü UI iş parçacığının bazen çok meşgul olabileceği noktası. INFINITE bayrağı set etiketi için çalışmaz. Bu yüzden sorunu küçük bir kod parçasıyla çözdüm:

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

aşağıdaki XML ile:

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

MIcon, düzenimden bir ImageView.


0

Bu sorunu çözdüm. Bu benim düzeltme sürümüm:

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

    }

}

}

0

Geriye dönük uyumlu bir uygulama üzerinde çalışırken bu sorunla karşılaştım. çok sinir bozucu! onCreate'den çağrılabilen ve herhangi bir animasyon kaynağını belirsiz bir döngüye sokacak güzel bir geçici çözüm sınıfını kodladım.

AnimationLooper sınıfına buradan ulaşılabilir: https://gist.github.com/2018678


0

İnternetten gelen cevapları araştırdıktan sonra bana çok yakışan bir çözüm buldum. (Ve evet, tekrarlaCount ve repeatMode, animationSet ile birlikte kullanıldığında son derece hatalı oluyor).

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>

Aktivitede: (Animasyon bittikten sonra hafif bir gecikme ekleyerek çözün)

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

Üzerinde araştırma yapmak isteyeceğiniz birçok sınıf var, ancak şu anda oldukça esnek olan objectAnimator'ı kullanıyorum. Animation veya AnimationUtils'i kullanmanızı tavsiye etmem:

  • Animasyon
  • AnimationUtils
  • Animatör
  • Animatör
  • AnimatörListener
  • AnimatorListenerAdapter

0

İlk animasyonun tamamlanmasını dinlemeniz ve onStopAnimation geri aramasında animasyonu yeniden başlatmanız gerekir, bu bağlantıyı deneyin


0

Kaynakların tekrar yüklenmesini önlemek için @Danufr yanıtında küçük ayarlamalar yapın.

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

0

Bu sorunu thread kullanarak çözdüm.

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

        }
    });

0

iyi çalışıyor

 GifDrawable gifDrawable = (GifDrawable) gifImageView.getDrawable();
    gifDrawable.setLoopCount(0);

0

Benim durumumda yukarıdaki çözümlerden hiçbiri işe yaramadı. Danuofr'un çözümü animasyon seti için işe yaradı, ancak birim testi yaparken, testlerim bu sonsuz döngüde sıkışıp kalıyordu. Son olarak, durumuma özel olarak, bu animasyonu belirli sayıda tekrar etmem gerekti. Bu yüzden anim_rot.xml'deki animasyonumun kopyalarını , ofset değerini ekleyerek kademeli olarak manuel olarak ekledim . Bunun kötü olduğunu ve pek çoğu için işe yaramayacağını biliyorum, ancak durumum için tek geçici çözüm buydu.

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>

Bunu animasyonu 3 kez tekrarlamak için yaptım. Ofset değerleri ekleyerek belirli zamanlarda tekrarlamak için daha fazla kopya ekleyebilirsiniz.


-1

Kodu bir döngü iş parçacığına veya while / for ifadesine eklemeyi deneyin


Bulduğum tek çözüm, set etiketi kullanmaktan kaçınmak.
Pavel Chernov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.