2015-06-05 2 views
2

Я пытаюсь увеличить количество циклов for for из обратного вызова, я не хочу, чтобы они увеличивались, если анимация не закончилась. К сожалению, я сталкиваюсь с проблемой, когда он рекомендует установить переменные (J и I) в final, а затем говорит, что я не могу их увеличивать, потому что они заключены в ".Цикл нарастания от обратного вызова/прослушивателя

Что можно сделать для увеличения переменных i и j при вызове onAnimationEnd?

public static void animateMarkerToICSNew(final Marker marker, AnimationRouteObj animationRouteObj) { 
    List<CoordsTimePair> mCoordsTimePairList = animationRouteObj.getCoordsTimePairList(); 

    for (int i = 0; i < mCoordsTimePairList.size();) { 
     CoordsTimePair mCoordsTimePair = mCoordsTimePairList.get(i); 
     int timeInMS = (mCoordsTimePair.getSeconds() * 1000); 
     LinkedHashSet<LatLng> latlngHashSet = mCoordsTimePair.getLatlngHashSet(); 
     final List<LatLng> latlngList = new ArrayList<LatLng>(latlngHashSet); 
     for (int j = 0; j < latlngList.size();) { 

      final LatLngInterpolator latLngInterpolator = new Linear(); 
      latLngInterpolator.interpolate(1, marker.getPosition(), latlngList.get(j)); 

      TypeEvaluator<LatLng> typeEvaluator = new TypeEvaluator<LatLng>() { 
       @Override 
       public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) { 
        return latLngInterpolator.interpolate(fraction, startValue, endValue); 
       } 
      }; 
      Property<Marker, LatLng> property = Property.of(Marker.class, LatLng.class, "position"); 
      ObjectAnimator animator = ObjectAnimator.ofObject(marker, property, typeEvaluator, latlngList.get(j)); 
      animator.setDuration(timeInMS); 
      animator.addListener(new AnimatorListener() { 

       @Override 
       public void onAnimationStart(Animator animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
        //INCREMENT INSIDE HERE 

       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 
        // TODO Auto-generated method stub 

       } 
      }); 
      animator.start(); 
     } 
    } 
} 

Ошибки я получаю не может относиться к неконечной локальным переменной J, определенной в области видимости (Это, прежде чем объявить переменную в качестве окончательного)

В последней локальной переменной J не может быть назначено, поскольку он определен в закрытом типе (Это после того, как я присвою переменную как окончательную)

+0

«i ++;» и 'j ++;' в этих областях не работают для вас? – ChrisStillwell

+0

Нет, это не сработает. Я отправлю полученные ошибки. –

ответ

1

вы не можете. Теоретически вы могли бы, но вы закончите с n разных анимаций, пока первый не закончится и не увеличит ваш индекс. Это потому, что цикл не останавливается, если вы не увеличиваете индекс, который используете в цикле. Вы можете достичь того, что хотите, используя метод View.post, когда вызывается onAnimationEnd, чтобы отправить Runnable, который извлекает записи из ваших коллекций и запускает следующую анимацию.

+0

Я не уверен, как это реализовать. Так что я буду искать, чтобы отойти от «Петли» вместе? –

+0

вам не нужен цикл. Вы не можете использовать цикл для достижения того, чего хотите. – Blackbelt

0

К сожалению, поскольку у вас есть это сейчас, это не сработает. Как говорят ваши ошибки, вы не можете получить доступ к этим переменным из внутреннего класса, если они не являются окончательными. То, что я рекомендую делать, - это взять весь код из цикла for и переместить его в отдельный метод. Затем вы можете вызвать этот метод с вашим объектом List<CoordsTimePair> и индексом объекта, который хотите оживить. Например:

private void animateCoords(final List<CoordsTimePair> mCoordsTimePairList, final int i, final int j) { 
    CoordsTimePair mCoordsTimePair = mCoordsTimePairList.get(i); 

    // ... insert the rest of your code from the for loop 

    animator.addListener(new AnimatorListener() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       if (j < latlngList.size() - 1) 
        animateCoords(mCoordsTimePairList, i, j + 1); 
       else if (i < mCoordsTimePairList.size() - 1) 
        animateCoords(mCoordsTimePairList, i + 1, 0); 
      } 

Это не будет работать точно так, как сейчас, но вы получаете общую идею? Таким образом, вам не нужны циклы for или для увеличения ваших конечных переменных/доступа к не конечным переменным во внутреннем классе. Ваш первый вызов этому методу будет animateCoords(mCoordsTimePairList, 0, 0);

+0

Это работает из того, что я вижу, единственная проблема, с которой я столкнулся, - это не прыжки между многими позициями. –

Смежные вопросы