2013-04-04 10 views
10

Tamamlandıktan hemen sonra kendini tekrar eden bir TextViews animasyonu oluşturmak istiyorum. Ben Canlandırmak istediğiniz her Görünüm için ViewPropertyAnimator ile döngü animasyonu nasıl oluşturulur?

, ben onAnimationEnd içine kodunun son parçasını yerleştirmek için çalıştı

final float oldX = v.getX(); 
final float newX = v.getX() - (float)totalWidth; 
final AnimatorListenerAdapter listener = new AnimatorListenerAdapter() { 
    @Override 
    public void onAnimationEnd(Animator animation) { 
     v.setX(oldX); 
     animFinished = true; 

     //This line won't compile 
     //v.animate().setDuration(animDuration).setInterpolator(newsInterpolator) 
     // .setListener(listener).x(newX); 
    } 
}; 

v.animate().setDuration(animDuration).setInterpolator(newsInterpolator) 
    .setListener(listener).x(newX); 

aşağıdaki kod parçası kullanın, ancak nesneyi gördüğü beri Java derlemek olmaz dinleyici başlatılmadı. Üstelik, bu "özyinelemeli" animasyon çağrısının iyi bir çözüm olduğunu düşünmüyorum, aklıma gelen ilk şeydi. Dönen özellik animasyonu uygulamak için basit ve sağlam bir yol olduğundan şüpheliyim, ancak onu bulmakta başarısız oldum, bu yüzden yardım için buraya döndüm. peşin

+0

Sen 'CycleInterpolator' kullanabilirsiniz. Cevabımıma bakın [here] (http://stackoverflow.com/a/40385244/2093236). – Dmide

+0

Sanırım "bu" dinleyici yerine ne kullanılacağıdır, ama evet muhtemelen hafızaya tutunur ve ne olursa olsun sızıntı olur. Neyse, bunun neredeyse 4 yaşında olduğunu anlıyorum. –

cevap

7

Eh içinde

sayesinde kendimi yeniden cevaplamak için gidiyorum.

TranslateAnimation sınıfının, animasyonu yineleme yöntemleri vardır, bu yüzden onu ViewPropertyAnimator yerine kullandım.

Aşağıdaki kod iş gibi görünüyor:

  long duration = 1000* ((long)totalWidth/newsScrollSpeed); 
      System.out.println("totalWidth="+totalWidth); 
      TranslateAnimation anim = new TranslateAnimation(0,-totalWidth,0,0); 
      anim.setInterpolator(linearInterpolator); 
      anim.setDuration(duration); 
      anim.setRepeatCount(TranslateAnimation.INFINITE); 
      anim.setRepeatMode(TranslateAnimation.RESTART); 

      for(i=0;i<this.getChildCount();i++) 
      { 
       View v = this.getChildAt(i); 

       if(v.getId() == R.id.yuruyen_yazi) 
       { 
        continue; 
       } 

       v.startAnimation(anim); 
      } 
2

Değil şık bir yol, ama işe yarıyor:

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     // update newX 
     v.animate().setDuration(animDuration).setInterpolator(newsInterpolator).x(newX).withEndAction(this).start(); 
    } 
}; 

v.animate().setDuration(animDuration).setInterpolator(newsInterpolator).x(newX).withEndAction(runnable).start();