【发布时间】:2015-02-07 00:00:08
【问题描述】:
我有一个简单的画布动画,如下:
function animate(){
var canvas = document.getElementById("canvas");
canvas.width = $(window).width();
canvas.addEventListener("click", replay, false);
var context = canvas.getContext("2d");
//animation code
function replay(e){
animate();
}
}
所以我的期望是当用户单击画布时动画将重播,因为我正在重新分配宽度:
canvas.width = $(window).width();
这将重置整个上下文状态(在此处阅读http://diveintohtml5.info/canvas.html)
它在您第一次单击画布时起作用,但之后它会记住上下文转换状态并显示一些奇怪的动画。
我尝试添加:
context.setTransform(1, 0, 0, 1, 0, 0);
在重新绘制之前将转换矩阵显式重置为单位矩阵,但没有效果。
和这个How to clear the canvas for redrawing不一样
因为它是关于如何清除 display 的上下文,但我想清除 everything display 加上 context 状态。
我尝试在动画期间记录每个变量的状态,但 ff 代码有些奇怪。
function moveHorizontal(x){
if(x < 100 ){
context.translate(1, 0);
console.log("x:"+x);
drawImage();
x += 1;
setTimeout(moveHorizontal,10,x);
}
}
我最初将此函数称为 moveHorizontal(0)。
所以日志第一次符合预期:
x:0
x:1
x:2
.
.
x:99
当我点击“replay”时,我得到与上面相同的内容:
x:0
x:1
x:2
.
.
x:99
这是正确,但是当我第二次点击“重播”时 我得到了这个:
x:0
x:0
x:1
x:1
.
.
.
x:99
x:99
这会使翻译增加三倍,导致意想不到的效果。
有什么解释吗?
【问题讨论】:
-
那是为了清除显示但我想清除所有内容(显示加上下文状态)
-
更新了我的问题。