दोहराता है मैं इसे समाप्त होने के बाद दोहराने के लिए 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
पर सेट करने का प्रयास किया है, लेकिन इससे कोई मदद नहीं मिली है।
संपादित करें: स्पष्ट है कि, क्या मैं पाने के लिए कोशिश कर रहा हूँ एक एनीमेशन है जो अपने आप को अनिश्चित काल को दोहराता है, एक अलग अवधि के साथ हर बार है।
कुछ सवाल: 'TylersContainer' क्या है? हर बार 'setupTimerBar' निष्पादित होने पर आप एक नया श्रोता क्यों जोड़ते हैं, और कभी भी किसी को हटा नहीं देते? 'SetAnimationStartDelay' के बाद आप' setAnimatorListenerAdapter' का आह्वान क्यों करते हैं? आपने 'एनीमेशन एन्ड' को कैसे सत्यापित किया है जिसे केवल एक बार बुलाया जाता है? – dst
'टायलरकंटनर 'एक ऐसी वस्तु है जिसमें एक दृश्य और अगली बस आने वाली समय (जिसे उस दृश्य में प्रदर्शित किया जाता है) का समय होता है। मैंने हर बार एक नया श्रोता जोड़ा क्योंकि यह मुझे मिला उदाहरण में किया गया था, मुझे यह भी नहीं पता था कि आपको श्रोताओं को हटाना था, मैंने सोचा कि उन्हें पूरा होने के बाद हटा दिया गया था। 'SetAnimationListenerAdapter' और' setAnimationStartDelay' का क्रम छोटा था। मैं सत्यापित करता हूं कि 'ऑनएनीमेशन एंड' को केवल बिल्ली को लॉग करने के लिए कुछ प्रिंट स्टेटमेंट्स के साथ बुलाया जा रहा है। – Tyler
"setAnimationListenerAdapter और setAnimationStartDelay का क्रम छोटा था।" मैंने पूछा क्योंकि मुझे यकीन नहीं है कि यह संभव है कि श्रोता को जोड़ा जाने से पहले 'ऑनएनीमेशन एंड' कहा जाता है। आम तौर पर, आप एंड्रॉइड की डीबगिंग क्षमताओं का उपयोग करके अपने कोड के निष्पादन के माध्यम से कदम उठाने का प्रयास कर सकते हैं। शायद परिणाम पैदा करता है? – dst