我发现,在一个循环中创建超时通常难于管理 - 你不想不得不取消多次超时。更好的方法是让函数执行工作,通过在完成之前设置一个超时来间接地调用它,因为那样你可以放入一个简单的if测试来决定是否设置下一个超时并继续动画。
也许有点像这样:
<input id="playPause" type="button" value="Play">
<script>
function initAnimation(animationMs, autoRepeat, waitForPlayButton) {
var currentFrame = 0,
$imgList = $("#gallery > img"),
paused = waitForPlayButton;
function drawNext() {
clearCanvas();
cvsCtx.drawImage($imgList[currentFrame++],0,0);
if (currentFrame >= $imgList.length) {
currentFrame = 0;
if (!autoRepeat) {
paused = true;
$("playPause").prop("value", "Play");
}
}
if (!paused)
setTimeout(drawNext, animationMs);
}
$("playPause").prop("value", waitForPlayButton ? "Play" : "Pause")
.click(function() {
this.value = (paused = !paused) ? "Play" : "Pause";
if (!paused)
drawNext();
});
if (!waitForPlayButton)
drawNext();
}
initAnimation(100, true, false);
</script>
如果autoRepeat
参数是假的动画将运行一次,并停止,但可以通过按钮重新启动,否则,(显然),它只是不断重复。
如果waitForPlayButton
是假的动画将立即开始,否则(显然)按下按钮时,它会开始。
按下按钮将在当前帧暂停。
(未测试,因为我没有一堆得心应手的图片,但我敢肯定你的想法,可以自己解决任何问题,或者让你得到错误,我知道...)
当我回家时我必须测试这个,但我认为这可能是我的问题的解决方案... – jazzytomato 2012-02-01 13:50:48
这很棒,您的代码“开箱即用”!非常感谢你 – jazzytomato 2012-02-01 15:34:48