上篇文章已经知道了绘制图形的基本代码了,但是还不能根据鼠标来绘制,本文将会介绍方法。
js的鼠标事件:关于这几个事件,有一篇文章做了很好的总结。
后面会有这几个事件的实际运用的代码。
这里有一个小小的细节,如果你的canvas是包在一个div里面的话,你想要取得鼠标的坐标的话,一定要减去div的相对偏移,因为canvas画图函数里面的坐标都是相对canvas左上角的。大致说明如下:
这里还牵扯到一个略微蛋疼的问题,canvas不能画点。所以当用户只是点了一下某区域然后并未移动鼠标的情况下就松开,是没有一个对应的方法叫drawPoint或者什么的把一个点画在这个坐标上面的。这里我用了一个折中的方法,我在原地画了一个很小的实心圆。
还有一个小细节,就是如何区分以下两个事件: A.用户在canvas上面点击了一下然后在canvas上拖动,B.用户没有点击或是在canvas之外的区域点击一下然后在canvas上面拖动。所以我们需要一个状态量来显示用户是不是真的在画。就交isPainting吧。
说了这么多,让我们来看一下目前的代码吧:
demo.html:
<!DOCTYPE html> <html> <head> <title>Simple Demo</title> <style> body { margin: 0px; padding: 0px; } #myCanvas { border: 1px solid #9C9898; } </style> </head> <body> <canvas id = "myCanvas" width = "800px" height = "500px"></canvas> <script type = "text/javascript" src = "main.js"></script> </body> </html> main.js:
var canvas, context, isPainting, clickX, clickY, clickDrag; var mouseDown = function(e){ var mouseX = e.pageX; var mouseY = e.pageY; isPainting = true; addClick(mouseX, mouseY, false); redraw(); } var mouseUp = function(e){ isPainting = false; redraw(); } var mouseMove = function(e){ if(isPainting){ var mouseX = e.pageX; var mouseY = e.pageY; addClick(mouseX, mouseY, true); redraw(); } } var mouseOut = function(e){ isPainting = false; } function addClick(mouseX, mouseY, isDragging){ clickX.push(mouseX); clickY.push(mouseY); clickDrag.push(isDragging); } //重绘 function redraw(){ context.clearRect (0 , 0, canvas.width , canvas.height ); context.strokeStyle = "#000000"; var numOfPts = clickX.length; for(var i=0; i<numOfPts; i++){ context.beginPath(); if(clickDrag[i]){ context.moveTo(clickX[i-1], clickY[i-1]); context.lineTo(clickX[i], clickY[i]); }else{ context.arc(clickX[i], clickY[i], 0.5, 0, 2*Math.PI, true); } context.closePath(); context.stroke(); } } //初始化 function init(){ canvas = document.getElementById("myCanvas"); context = canvas.getContext("2d"); isPainting = false; clickX = new Array(); clickY = new Array(); clickDrag = new Array(); //鼠标事件 canvas.onmousedown = mouseDown; canvas.onmouseup = mouseUp; canvas.onmousemove = mouseMove; canvas.onmouseout = mouseOut; } window.onload = init();
这样就实现了铅笔绘图。如果你想添加新的功能,比如:修改颜色,则可以设置一个参数比如curColor什么的,然后给一个方法去动态修改,并且在redraw中使用这个参数作为strokeStyle。 对了,stroke的风格是很多变的,这里只是最基本的,你可以改变很多。