2013-04-04 2 views
10

Я хочу создать анимацию TextViews, которая повторяется сразу после завершения.Как создать анимацию цикла с помощью ViewPropertyAnimator?

Для каждого ракурса я хочу оживить, я использую следующий фрагмент кода

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

Я пытался поставить последний кусок кода в onAnimationEnd, но Java не компилировать, так как он считает объект слушатель не инициализирован. Более того, я не думаю, что этот «рекурсивный» призыв анимации является хорошим решением, это было первое, что мне пришло в голову. Я подозрительно, что есть простой и надежный способ реализовать анимацию анимации циклов, но мне не удалось найти ее, поэтому я обратился за помощью.

Заранее спасибо

+0

Вы можете использовать 'CycleInterpolator'. См. Мой ответ [здесь] (http://stackoverflow.com/a/40385244/2093236). – Dmide

+0

Я думаю, что «это» будет тем, что использовать вместо слушателя, но да, возможно, он просто держит память и течет, если это произойдет. В любом случае, я понимаю, что сейчас уже почти 4 года. –

ответ

7

Ну, я буду отвечать на себя снова.

TranslateAnimation класс имеет методы повторения анимации, поэтому я использовал его вместо ViewPropertyAnimator.

Следующий код, кажется, работает:

  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

Не изящный способ, но он работает:

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(); 
Смежные вопросы