Я пытаюсь получить 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: Чтобы было ясно, что я пытаюсь получить это анимация, которая повторяется до бесконечности, каждый раз с разной длительности.
Некоторые вопросы: Что такое 'TylersContainer'? Почему вы добавляете нового слушателя каждый раз, когда 'setupTimerBar' выполняется и никогда не удаляется? Почему вы вызываете 'setAnimatorListenerAdapter' после' setAnimationStartDelay'? Как вы подтвердили, что 'onAnimationEnd' вызывается только один раз? – dst
'TylersContainer' - объект, который содержит представление и время, когда приближается следующая шина (которая отображается в этом представлении). Я каждый раз добавлял нового слушателя, потому что, как это было сделано в примере, который я нашел, я также не знал, что вам нужно удалить слушателей, я думал, что они просто были удалены после завершения. Порядок 'setAnimationListenerAdapter' и' setAnimationStartDelay' был тривиальным. Я проверяю, что 'onAnimationEnd' вызывается только один раз с некоторыми операторами печати для журнала cat. – Tyler
«Порядок setAnimationListenerAdapter и setAnimationStartDelay был тривиальным». Я спросил, поскольку я не уверен, возможно ли, что 'onAnimationEnd' вызывается до того, как слушатель был добавлен. В общем, вы можете попытаться выполнить выполнение кода с помощью возможностей отладки android. Может быть, это дает результаты? – dst