2013-12-18 31 views
12

Bir kez bittiğinde tekrarlamak için bir ValueAnimator almaya çalışıyorum. ListView'da SeekBar ile kullanıyorum. Bazı nedenlerle, ValueAnimator bitecek, onAnimationEnd()'u tekrar tetikleyecek, ancak sonuna geldiğinde onAnimationEnd() asla ikinci kez çağrılmayacaktır.ValueAnimator yalnızca bir kez tekrarlanır

@Override 
    public View getContentView(int position, View convertView, ViewGroup parent) { 
     ... 
     setupTimerBar(t); 
     ... 
    } 


    private AnimatorListenerAdapter generateNewAnimatorListenerAdapter(final TylersContainer t) { 
     return new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       setupTimerBar(t); 
      } 
     }; 
    } 

    private void setupTimerBar(TylersContainer t) 
    {  
     View view = t.getView(); 
     BusTime arrivalTime = t.getBusTime(); 
     int minutes = BusTime.differenceInMiuntes(arrivalTime, BusTime.now()); 
     long milliseconds = minutes * 60 * 1000; 

     final TimerBar seekBar = (TimerBar) view.findViewById(R.id.SeekBar); 

     int progress = Utility.setProgress(arrivalTime, seekBar.getMax()); 
     long duration = Utility.setAnimationDuration(progress); 

     seekBar.setProgress(progress); 
     seekBar.setAnimationDuration(duration); 
     seekBar.setAnimationStartDelay(milliseconds); 
     seekBar.setAnimatorListenerAdapter(generateNewAnimatorListenerAdapter(t)); 
    } 

seekBar nesne aslında bir SeekBar ve ValueAnimator içeren bir özel nesnedir, burada alakalı bit şunlardır:

//Constructor 
    public TimerBar(Context context) { 
     super(context); 

     startTime = Calendar.getInstance(); 
     valueAnimator = ValueAnimator.ofInt(0, getMax()); 

     //Override the update to set this object progress to the animation's value 
     valueAnimator.addUpdateListener(new AnimatorUpdateListener() { 

      @Override 
      public void onAnimationUpdate(ValueAnimator animation) {  
       int animProgress = (Integer) animation.getAnimatedValue(); 
       setProgress(animProgress); 

      } 
     }); 
    } 

    //Specify the start time by passing a long, representing the delay in milliseconds 
    public void setAnimationStartDelay(long milliseconds){ 

     //Set the delay (if need be) and start the counter 
     if(milliseconds > 0) 
      valueAnimator.setStartDelay(milliseconds); 

     valueAnimator.setIntValues(this.getProgress(), this.getMax()); 

     valueAnimator.start(); 
    } 


    //Set the duration of the animation 
    public void setAnimationDuration(long duration){ 
     valueAnimator.setDuration(duration); 
    } 


    public void setAnimatorListenerAdapter(AnimatorListenerAdapter ala){ 
     valueAnimator.addListener(ala); 
    } 

neden onu anlamaya olamaz ikiden fazla tekrarlamıyor.

Repeat özniteliğini kullanarak ve bunu INIFINITI olarak ayarlamayı denedim, ancak bu da işe yaramadı.


Düzenleme: Açık olmak gerekirse, ne almaya çalışıyorum süresiz tekerrür bir animasyon, farklı bir süresi her zamandır. durumda

+0

bazı sorular: 'TylersContainer' nedir? 'SetupTimerBar' her çalıştırıldığında niçin yeni bir dinleyici ekliyorsunuz? SetAnimationStartDelay işlevinin ardından setAnimatorListenerAdapter öğesini neden çağırıyorsunuz? OnAnimationEnd’i nasıl doğruladınız? – dst

+0

'TylersContainer', görünümü ve sonraki veri yolunun geldiği zamanı gösteren bir nesnedir (bu görünümde görüntülenir). Her seferinde yeni bir dinleyici ekledim, çünkü bulduğum örnekte nasıl yapıldığı, dinleyicileri kaldırmanız gerektiğini bilmiyordum, tamamlandıktan sonra kaldırıldığını düşündüm. 'SetAnimationListenerAdapter' ve' setAnimationStartDelay 'sırası önemsiz. 'OnAnimationEnd' öğesinin yalnızca kedi girişini yazdırmak için bazı baskı ifadeleriyle çağrıldığını doğrularım. – Tyler

+0

"SetAnimationListenerAdapter ve setAnimationStartDelay sırası önemsiz." Dinleyicinin eklenmesinden önce 'onAnimationEnd' çağrısının mümkün olup olmadığından emin değilim diye sordum. Genel olarak, android'in hata ayıklama yeteneklerini kullanarak kodunuzun yürütülmesini adım adım deneyebilirsiniz. Belki bu sonuç verir? – dst

cevap

1

Eğer Animator kullanıyorsanız ve sonra animasyon tekrarlar sonlu kez durumunda kullanılır Animator.AnimatorListener

fonksiyon AnimatorListener.onAnimationEnd() ile bağlamak ve sadece durumda animasyon olarak bir kez

denir kaç kez, tekrar ediyor, sen tekrarlar her repeatance bitiminden sonra her Animasyonunuzu uygulanacaktır yerine işlevini AnimatorListener.onAnimationRepeat() kullanılarak yapılmalıdır

Anladığım kadarıyla

, sana gereken onAnimationRepeat(), yani sadece onAnimationRepeat() için onAnimationEnd() her tekrarlamak sonra yürütülecek istediğiniz kodu taşırsanız, işte bu

Referans düzeltmek olmalıdır: http://developer.android.com/reference/android/animation/Animator.AnimatorListener.html

11

I işe yaramadı hangi sonsuz için RepeatMode ayar hata yaptık, bu RepeatCount olarak ayarlanması gerekir:

valueAnimator.setRepeatCount(ValueAnimator.INFINITE); 
İlgili konular