canvas canvas()javascript

时间:2018-06-16 16:23:21

标签: javascript canvas

我想创建一个涉及绘制线条的画布场景。从字面上看,给出从一个x / y坐标到另一个x / y坐标绘制实线的外观。我的麻烦似乎与我使用save()和restore()有关。我理解它的方式是,如果我在开始绘图之前保存()我的画布,我可以调用restore()将画布重置回该开始状态。通过这种方式,我可以在没有扭曲画布的情况下开始下一行。

运行以下代码时,第一行按预期绘制。然后我调用restore()以允许我使用非扭曲的画布来处理下一行。结果(看起来似乎)第二行按照指示绘制。我再次调用restore()以允许我从一个指定的坐标集绘制第三行到另一个坐标。但是,第三行不是从给定的坐标开始。就好像画布仍然从前一行扭曲,但我无法理解为什么。任何人都可以解释我的困境吗? (另外,有一种更简单的方法来创建这种风格的线条图,对于网络,你能告诉我吗?)

var canvas = document.getElementById('canvas');
var c = canvas.getContext('2d');
c.save();

var a = 0;
function callVerticalTeal() {
    if(a < 200) { //draw line the length of 200px
        drawVerticalTeal();
        a++;
        setTimeout(callVerticalTeal, 0);
    }
setTimeout(callHorizontalRed, 1200);    
}

function drawVerticalTeal(){
    c.transform(1,0,0,1,0,1);
    c.beginPath();
    c.moveTo(325, 200);
    c.strokeStyle = 'teal';
    c.lineCap = 'round';
    c.lineWidth = 10;   
    c.lineTo(325, 200); 
    c.stroke();

}
// Start the loop
setTimeout(callVerticalTeal, 0);

var b = 0;
function callHorizontalRed() {
    if(b < 200) { 
        drawHorizontalRed();
        b++;
        setTimeout(callHorizontalRed, 1000); 
    }
    c.restore();
    setTimeout(callHorizontalBlack, 1200);
}

function drawHorizontalRed(){       
    c.restore();
    c.transform(1,0,0,1,1,0);
    c.beginPath();
    c.moveTo(325, 200);
    c.strokeStyle = 'brown';
    c.lineCap = 'round';
    c.lineWidth = 10;   
    c.lineTo(325, 200); 
    c.stroke();
}

var x = 0;

function callHorizontalBlack() {
    if(x < 200) { 
        draw();
        x++;
        setTimeout(call, 5000); 
    }
    setTimeout(callVerticalBlack, 1200);
}

function draw(){
    c.restore();
    c.transform(1,0,0,1,1,0);
    c.beginPath();
    c.moveTo(325, 400); 
    c.strokeStyle = 'black';
    c.lineCap = 'round';
    c.lineWidth = 10;   
    c.lineTo(325, 400); 
    c.stroke();
}

1 个答案:

答案 0 :(得分:1)

只调用一次context.save()。通常在任何绘图方法中首先调用context.save(),context.restore()是最后一次调用。所以它是一个拦截器,如果你想这样称呼它。

function paintSomething() {
    ctx.save();
    // now paint something
    ctx.restore(); // we now are clean again, because we have the previously saved state
}