我想创建一个包含绘图线的画布场景。从字面上看,是为了使实线从一个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();
}

最佳答案

您只调用一次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
}

关于javascript - Canvas 恢复问题()JavaScript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50889635/

10-11 12:09