橡皮筋画直线c 语言,canvas——橡皮筋式线条绘图应用

什么叫橡皮筋式

指画图时橡皮筋一样伸缩自如。。

例子如下?

bVbn5kb?w=731&h=483

思路

思路很简单,只有橡皮筋式绘制功能要注意,以下总结mousedown,mousemove,mouseup三个阶段的思路

mousedown:记录start位置,drag(记录是否处于拖动状态)设置为true,getImageData(橡皮筋效果关键1)

mousemove:获取拖动时的位置pos,putImageData(对应getImageData,橡皮筋效果关键2),根据pos与start画直线

mouseup:drag恢复为false

关键就在于putImageData()与getImageData()这两个canvas的方法,putImageData()记录了鼠标点下时的图像,getImageData()对应还原。如果没有执行这两个方法就会出现以下的效果

bVbn5jq?w=721&h=487

putImageData()相当于把“扫描”出来的线都擦掉

代码

let canvas = document.getElementById('canvas'),

ctx = canvas.getContext('2d'),

canvasLeft = canvas.getBoundingClientRect().left, //getBoundingClientRect()获取元素位置

canvasTop = canvas.getBoundingClientRect().top;

let imageData; //记录图像数据

let start = new Map([['x',null],['y',null]]);

let drag = false;//记录是否处于拖动状态

canvas.onmousedown = function (e) {

let pos = positionInCanvas(e, canvasLeft, canvasTop);

start.set('x', pos.x);

start.set('y', pos.y);

drag = true;

//记录imageData

imageData = ctx.getImageData(0,0,canvas.width,canvas.height);

}

canvas.onmousemove = function (e) {

if(drag === true){

let pos = positionInCanvas(e, canvasLeft, canvasTop);

//相当于把扫描出来的线都擦掉,重新画

ctx.putImageData(imageData, 0, 0);

ctx.beginPath();

ctx.moveTo(start.get('x'), start.get('y'));

ctx.lineTo(pos.x, pos.y);

ctx.stroke();

}

}

canvas.onmouseup = function (e) {

drag = false;

}

function positionInCanvas (e, canvasLeft, canvasTop) {//获取canvas中鼠标点击位置

return {

x:e.clientX - canvasLeft,

y:e.clientY - canvasTop

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值