Bir kez bittiğinde tekrarlamak için bir ValueAnimator
almaya çalışıyorum. ListView
'da SeekBar
ile kullanıyorum. Bazı nedenlerle, ValueAnimator
bitecek, onAnimationEnd()
'u tekrar tetikleyecek, ancak sonuna geldiğinde onAnimationEnd()
asla ikinci kez çağrılmayacaktır.ValueAnimator yalnızca bir kez tekrarlanır
@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
nesne aslında bir SeekBar
ve ValueAnimator
içeren bir özel nesnedir, burada alakalı bit şunlardır:
//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);
}
neden onu anlamaya olamaz ikiden fazla tekrarlamıyor.
Repeat
özniteliğini kullanarak ve bunu INIFINITI
olarak ayarlamayı denedim, ancak bu da işe yaramadı.
Düzenleme: Açık olmak gerekirse, ne almaya çalışıyorum süresiz tekerrür bir animasyon, farklı bir süresi her zamandır. durumda
bazı sorular: 'TylersContainer' nedir? 'SetupTimerBar' her çalıştırıldığında niçin yeni bir dinleyici ekliyorsunuz? SetAnimationStartDelay işlevinin ardından setAnimatorListenerAdapter öğesini neden çağırıyorsunuz? OnAnimationEnd’i nasıl doğruladınız? – dst
'TylersContainer', görünümü ve sonraki veri yolunun geldiği zamanı gösteren bir nesnedir (bu görünümde görüntülenir). Her seferinde yeni bir dinleyici ekledim, çünkü bulduğum örnekte nasıl yapıldığı, dinleyicileri kaldırmanız gerektiğini bilmiyordum, tamamlandıktan sonra kaldırıldığını düşündüm. 'SetAnimationListenerAdapter' ve' setAnimationStartDelay 'sırası önemsiz. 'OnAnimationEnd' öğesinin yalnızca kedi girişini yazdırmak için bazı baskı ifadeleriyle çağrıldığını doğrularım. – Tyler
"SetAnimationListenerAdapter ve setAnimationStartDelay sırası önemsiz." Dinleyicinin eklenmesinden önce 'onAnimationEnd' çağrısının mümkün olup olmadığından emin değilim diye sordum. Genel olarak, android'in hata ayıklama yeteneklerini kullanarak kodunuzun yürütülmesini adım adım deneyebilirsiniz. Belki bu sonuç verir? – dst