我试图通过使用ObjectAnimator来进行搜索栏动画。问题是如果我将ObjectiAnimator的持续时间设置为较大的值,它将在启动之前有一个延迟。这是我的代码:
_replayBar.setMax(FlightLogger.getTimeLength());
_replayBar.setOnSeekBarChangeListener(this);
_timeMax.setText(secondsToTimeFormat(0) + "/" + secondsToTimeFormat(_replayBar.getMax()));
anim=ObjectAnimator.ofInt(_replayBar, "progress", 0, _replayBar.getMax());
anim.setDuration(_replayBar.getMax() * 1000);
其中anim是objectAnimator,_replaybar是搜索栏,FlightLogger.getTimeLenth()以毫秒为单位返回时间。
我所要做的就是让搜索栏更新过程实时到秒。但是如果传递给anim.setDuration的值变得太大(即:2分钟),它将延迟启动几秒钟。如果持续时间变得更大(即:1小时),延迟可能只有几分钟。
我还尝试使用具有类似代码的ValueAnimator,以及onAnimationUpdate侦听器,如下所示:
anim.addUpdateListener(new ObjectAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
if (!anim.isRunning())
anim.resume();
animProgress = (Integer) valueAnimator.getAnimatedValue();
Log.d(TAG, "progress: " + valueAnimator.getAnimatedValue());
_replayBar.setProgress(animProgress);
}
});
我在侦听器中记录进程,并为每个进程返回重复值,类似于ValueAnimator duplicate Values when starting。
任何人都可以帮助我吗? 非常感谢
答案 0 :(得分:0)
用CountDownTimer解决了我的问题,感谢pskink的建议。 这是计时器类:
public class BCountDownTimer extends CountDownTimer{
public BCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long l) {
millisLeft=l;
int seekBarProgress= _replayBar.getMax()-(int)(l*0.001);
_replayBar.setProgress(seekBarProgress);
}
@Override
public void onFinish() {
_replayBar.setProgress(_replayBar.getMax());
isPlaying = false;
_playPause.setImageResource(R.drawable.ic_btn_play);
_timer= new BCountDownTimer(_replayBar.getMax()*1000, 1000);
}
}
为了暂停和恢复,millisLeft存储剩余的时间。