javascript - 翻译后递归清除 Canvas

标签 javascript html canvas

我试图在每次按右键时翻译并保存我的 Canvas ,以便每次按右键时它都会水平移动。这是我每次用来水平移动 Canvas 的函数,它第一次工作,但以后就不行了。

function clearRight(){

var canvas1=document.getElementById('plot');
ctx=canvas1.getContext("2d");
ctx.restore();
ctx.translate(-1000,0);
ctx.save();
ctx.clearRect(0,0,canvas1.width,canvas1.height);
}

rightKey(){
    clearRight();
    draw();
}

任何人都可以指出我在尝试移动 Canvas 时出错的地方吗?

更新 我已经解决了我面临的问题。

水平移动 Canvas

var translated=0;

function clear()
{

    var canvas1=document.getElementById('plot');
    var ctx=canvas1.getContext("2d");
    ctx.restore();
    ctx.save();
    ctx.clearRect(0,0,canvas1.width,canvas1.height);

}

function rightKey()
{   
        clear();
    ctx.clearRect(0,0,canvas1.width,canvas1.height);
    translated += 10;
    ctx.translate(-translated,300);
    draw(ctx);
}

最佳答案

我假设您不只是绘制包含在启用滚动条的较小 div 包装中的超大 Canvas ......所以这里有一个替代方案。

您可以将整个绘制的图表绘制到单独的 Canvas 上。

然后,要向左/向右平移,您可以将该临时 Canvas 绘制到带有偏移的主 Canvas 上。

演示:http://jsfiddle.net/m1erickson/GfRLq/

向右平移之前:

enter image description here

向右平移后:

enter image description here

关于动态变化的绘图:

如果您的绘图是动态的,那么您仍然可以使用这种平移技术。

只需用每个新绘图更新 tempCanvas 即可。

示例代码:

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var offset=0;

    // create some test data
    var points=[];
    for(var i=0;i<50;i++){
        points.push({x:i*40,y:100+Math.random()*100-50});
    }

    // create a temporary canvas
    var tempCanvas=document.createElement("canvas");
    var tempCtx=tempCanvas.getContext("2d");

    tempCanvas.width=40*points.length;
    tempCanvas.height=300;

    // draw your complete plot on the tempCanvas

    // draw the line
    tempCtx.beginPath();
    tempCtx.moveTo(points[0].x,points[0].y);
    for(var i=0;i<points.length;i++){
        var point=points[i];
        tempCtx.lineTo(point.x,point.y);
    }
    tempCtx.lineWidth=5;
    tempCtx.strokeStyle="blue";
    tempCtx.stroke();

    // draw the markers
    for(var i=0;i<points.length;i++){
        var point=points[i];
        tempCtx.beginPath();
        tempCtx.arc(point.x,point.y,10,0,Math.PI*2);
        tempCtx.closePath();
        tempCtx.fillStyle="black";
        tempCtx.fill();
        tempCtx.fillStyle="white";
        tempCtx.fillText(i,point.x-3,point.y+3);
    }

    ctx.drawImage(tempCanvas,0,0)


    // function to draw the canvas with your specified offset
    function drawPlotWithOffset(offset){
        ctx.clearRect(0,0,canvas.width,canvas.height);
        ctx.drawImage(tempCanvas,offset,0,canvas.width,canvas.height,0,0,canvas.width,canvas.height)
    }

    $("#left").click(function(){
        offset-=20;
        if(offset<0){offset=0;}
        drawPlotWithOffset(offset);
    });
    $("#right").click(function(){
        offset+=20;
        if(offset>tempCanvas.width-canvas.width){
            offset=tempCanvas.width-canvas.width;
        }
        drawPlotWithOffset(offset);
    });

}); // end $(function(){});
</script>
</head>
<body>
    <button id="left">Pan Left</button><br>
    <button id="right">Pan Right</button><br>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

关于javascript - 翻译后递归清除 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22257594/

相关文章:

javascript - 在 html 控件中创建闭环选项卡顺序

html - 如何去掉侧边菜单按钮的边框

html - 在文本下放置一个 css 按钮

android - android自定义 View 中的DrawPath

javascript - 显示用户是否通过身份验证的 View

javascript - 如何在javascript中使用模型?

javascript - 使用 javascript 检查 html 表中是否存在变量

javascript - 可以设置选择元素的样式,以便在下拉列表 'closed' 时显示所选选项的样式?

javascript - FabricJS - 禁用平移视口(viewport) -x -y 轴

javascript - 调整 HTML5 Canvas 中图像的大小