HTML画布canvas绘制图形,解决拖影问题

 

在使用HTMl画面 canvas 绘制矩形,圆等图形时,总是出现拖影。

解决这个问题有很多中方法:

方法一:鼠标移动过程中中不画上去,在释放鼠标的时候绘制上去,这样就看不到拖影,但是看不到绘制过程

方法二:在鼠标移动的时候,清除上一次绘制的矩形,然后在画,这样就没有拖影了,但是计算起来麻烦,要多几行代码

方法三:结合方法一和方法二,做两层画布,重叠显示,上层作为临时画布,下层持久显示,上层在鼠标移动过程中,清空整个画布,不用计算上一次的矩形位置

 

示例代码(方法三)

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 批注画布 -->
    <canvas id="canvas" style="background-color: transparent;border: 1px solid red;position: absolute;top: 100px;left: 100px; z-index: 100;" width="800px" height="600px"></canvas>
    <canvas id="canvas_lasting" style="background-color: transparent;border: 1px solid red;position: absolute;top: 100px;left: 100px;" width="800px" height="600px"></canvas>
    <script>
        var canvas = document.getElementById("canvas");                     // 批注画布-临时
        var ctx = canvas.getContext("2d");

        var canvas_lasting = document.getElementById("canvas_lasting");     // 批注画布
        var ctx_lasting = canvas_lasting.getContext("2d");

        var state = {"press": false}
        var rect = {"x":0, "y":0, "w":0, "h":0}

        canvas.addEventListener("mousedown", (e)=>{
            state.press = true;
            rect = {"x": e.offsetX, "y": e.offsetY, "w": 0, "h": 0}
        })

        canvas.addEventListener("mousemove", (e)=>{
            if(state.press){
                rect.w = e.offsetX - rect.x;
                rect.h= e.offsetY - rect.y;
                
                ctx.clearRect(0, 0, canvas.width, canvas.height)
                ctx.beginPath();
                ctx.rect(rect.x, rect.y, rect.w, rect.h);
                ctx.stroke();
            }
        })

        canvas.addEventListener("mouseup", (e)=>{
            state.press = false;

            ctx_lasting.beginPath();
            ctx_lasting.rect(rect.x, rect.y, rect.w, rect.h);
            ctx_lasting.stroke();
        })
    </script>
</body>
</html>
复制代码

 

 

 

posted @   十一的杂文录  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示