2013-12-18 2 views
12

Я пытаюсь получить ValueAnimator, чтобы повторить, как только он закончится. Я использую его с SeekBar в ListView. По какой-то причине закончится ValueAnimator, запустите снова onAnimationEnd(), но затем, когда он достигнет конца, onAnimationEnd() никогда не будет вызываться во второй раз.ValueAnimator только повторяет один раз

@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 фактически является пользовательский объект, который содержит SeekBar и ValueAnimator, вот соответствующие биты:

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

Я не могу понять, почему это не повторяется более двух раз.

Я попытался использовать атрибут Repeat и установить его на INIFINITI, но это тоже не помогло.


Edit: Чтобы было ясно, что я пытаюсь получить это анимация, которая повторяется до бесконечности, каждый раз с разной длительности.

+0

Некоторые вопросы: Что такое 'TylersContainer'? Почему вы добавляете нового слушателя каждый раз, когда 'setupTimerBar' выполняется и никогда не удаляется? Почему вы вызываете 'setAnimatorListenerAdapter' после' setAnimationStartDelay'? Как вы подтвердили, что 'onAnimationEnd' вызывается только один раз? – dst

+0

'TylersContainer' - объект, который содержит представление и время, когда приближается следующая шина (которая отображается в этом представлении). Я каждый раз добавлял нового слушателя, потому что, как это было сделано в примере, который я нашел, я также не знал, что вам нужно удалить слушателей, я думал, что они просто были удалены после завершения. Порядок 'setAnimationListenerAdapter' и' setAnimationStartDelay' был тривиальным. Я проверяю, что 'onAnimationEnd' вызывается только один раз с некоторыми операторами печати для журнала cat. – Tyler

+0

«Порядок setAnimationListenerAdapter и setAnimationStartDelay был тривиальным». Я спросил, поскольку я не уверен, возможно ли, что 'onAnimationEnd' вызывается до того, как слушатель был добавлен. В общем, вы можете попытаться выполнить выполнение кода с помощью возможностей отладки android. Может быть, это дает результаты? – dst

ответ

1

В случае, если вы используете Animator, а затем связать его с Animator.AnimatorListener

Функция AnimatorListener.onAnimationEnd() используется в случае, если ваша анимация повторяется для конечных времен, и вызывается только один раз

В случае, если ваша анимация повторяется, для количества раз вы должны использовать функцию AnimatorListener.onAnimationRepeat() вместо этого, которая будет применяться каждый раз, когда ваша анимация повторяет после окончания каждого повторения

Из того, что я понимаю, что вам нужно, это onAnimationRepeat(), так что если вы просто переместить код, который вы хотите быть выполнены после каждого повтора от onAnimationEnd() до onAnimationRepeat(), это должно исправить это

Ссылка: http://developer.android.com/reference/android/animation/Animator.AnimatorListener.html

11

I сделали ошибку установки на RepeatMode до бесконечности, которая не работает, то это должно быть установлено как RepeatCount:

valueAnimator.setRepeatCount(ValueAnimator.INFINITE); 
Смежные вопросы