2013-12-18 20 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 पर सेट करने का प्रयास किया है, लेकिन इससे कोई मदद नहीं मिली है।


संपादित करें: स्पष्ट है कि, क्या मैं पाने के लिए कोशिश कर रहा हूँ एक एनीमेशन है जो अपने आप को अनिश्चित काल को दोहराता है, एक अलग अवधि के साथ हर बार है।

+0

कुछ सवाल: 'TylersContainer' क्या है? हर बार 'setupTimerBar' निष्पादित होने पर आप एक नया श्रोता क्यों जोड़ते हैं, और कभी भी किसी को हटा नहीं देते? 'SetAnimationStartDelay' के बाद आप' setAnimatorListenerAdapter' का आह्वान क्यों करते हैं? आपने 'एनीमेशन एन्ड' को कैसे सत्यापित किया है जिसे केवल एक बार बुलाया जाता है? – dst

+0

'टायलरकंटनर 'एक ऐसी वस्तु है जिसमें एक दृश्य और अगली बस आने वाली समय (जिसे उस दृश्य में प्रदर्शित किया जाता है) का समय होता है। मैंने हर बार एक नया श्रोता जोड़ा क्योंकि यह मुझे मिला उदाहरण में किया गया था, मुझे यह भी नहीं पता था कि आपको श्रोताओं को हटाना था, मैंने सोचा कि उन्हें पूरा होने के बाद हटा दिया गया था। 'SetAnimationListenerAdapter' और' setAnimationStartDelay' का क्रम छोटा था। मैं सत्यापित करता हूं कि 'ऑनएनीमेशन एंड' को केवल बिल्ली को लॉग करने के लिए कुछ प्रिंट स्टेटमेंट्स के साथ बुलाया जा रहा है। – Tyler

+0

"setAnimationListenerAdapter और setAnimationStartDelay का क्रम छोटा था।" मैंने पूछा क्योंकि मुझे यकीन नहीं है कि यह संभव है कि श्रोता को जोड़ा जाने से पहले 'ऑनएनीमेशन एंड' कहा जाता है। आम तौर पर, आप एंड्रॉइड की डीबगिंग क्षमताओं का उपयोग करके अपने कोड के निष्पादन के माध्यम से कदम उठाने का प्रयास कर सकते हैं। शायद परिणाम पैदा करता है? – dst

उत्तर

1

मामले में आप Animator उपयोग कर रहे हैं, और फिर Animator.AnimatorListener

समारोह AnimatorListener.onAnimationEnd() साथ यह बाँध परिमित समय के लिए मामले में प्रयोग किया जाता है अपने एनीमेशन दोहराता है, और केवल मामला अपने एनीमेशन में एक बार

कहा जाता है दोहराना है, कई बार, आपको फ़ंक्शन AnimatorListener.onAnimationRepeat() का उपयोग करना चाहिए, जो हर बार आपके एनीमेशन प्रत्येक दोहराव के अंत के बाद दोहराएगा

मैं क्या समझ से, आप क्या जरूरत है onAnimationRepeat() है, इसलिए यदि आप सिर्फ कोड है कि आप onAnimationRepeat() को onAnimationEnd() से प्रत्येक दोहराने के बाद क्रियान्वित किया जा करना चाहते हैं ले जाते हैं, इसे ठीक करना चाहिए यह

संदर्भ: http://developer.android.com/reference/android/animation/Animator.AnimatorListener.html

11

मैं अनंत जो काम नहीं किया स्थापित करने की RepeatMode त्रुटि की है, इस RepeatCount के रूप में स्थापित किया जाना चाहिए:

valueAnimator.setRepeatCount(ValueAnimator.INFINITE); 
संबंधित मुद्दे