2013-04-04 21 views
10

Chcę zbudować animację TextViews, która powtarza się tuż po zakończeniu.Jak wygenerować zapętlanie animacji za pomocą ViewPropertyAnimator?

dla każdego widoku chcę, aby animować, używam następujący kawałek kodu

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

próbowałem umieścić ostatni kawałek kodu do onAnimationEnd, ale Java nie skompilować, ponieważ uważa, że ​​obiekt detektor nie został zainicjowany. Co więcej, nie sądzę, aby ta "rekurencyjna" inwokacja była dobrym rozwiązaniem, to była pierwsza rzecz, która przyszła mi do głowy. Podejrzewam, że istnieje prosty i dobry sposób na zaimplementowanie animacji właściwości pętli, ale nie udało mi się jej zlokalizować, dlatego zwróciłem się o pomoc.

Z góry dzięki

+0

Można użyć 'CycleInterpolator'. Zobacz moją odpowiedź [tutaj] (http://stackoverflow.com/a/40385244/2093236). – Dmide

+0

Myślę, że "to" byłoby tym, co używać zamiast słuchacza, ale tak, to prawdopodobnie trzymałoby się pamięci i wycieku, jeśli to się stało. W każdym razie zdaję sobie sprawę, że to już prawie 4 lata. –

Odpowiedz

7

Cóż, mam zamiar odpowiedzieć sobie ponownie.

Klasa TranslateAnimation ma metody powtarzania animacji, więc użyłem jej zamiast ViewPropertyAnimator.

Poniższy kod wydaje się działać:

  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

Not elegancki sposób, ale działa:

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(); 
Powiązane problemy