html画布鼠标后的一行
html canvas a line following mouse
所以我想在鼠标后面画一条线,点击绘制这条线,我需要它来绘制多边形。我的想法是每次鼠标移动时都画一条线,但这会把很多线弄得一团糟,所以我决定在鼠标移动后用白线来清理旧线,这样从上次点击的点到当前鼠标位置只有一条线。我的jsFiddle。但它并没有按照我想要的方式工作,是的,我在点击时画多边形,但鼠标后面没有线,所以我看不到我画的是哪条线。我不知道哪里出了问题?也许有一些现成的解决方案我没有找到?Mycode:
var polygonX = [];
var polygonY = [];
var lineReady = 0;
var whileLineX;
var whiteLineY;
$("#body").bind('mousemove', function (ev) {
if (lineReady >= 2) {
var context;
//clear old lines
if (whiteLineX !== null && whiteLineY !== null) {
context = $("#canvas")[0].getContext('2d');
context.moveTo(polygonX[lineReady - 1], polygonY[lineReady - 1]);
context.lineTo(whiteLineX, whiteLineY);
context.strokeStyle = '#ffffff';
context.stroke();
}
//draw a new line
context = $("#canvas")[0].getContext('2d');
var offset = $('#body').offset();
var x = ev.clientX - offset.left;
var y = ev.clientY - offset.top;
context.beginPath();
context.moveTo(polygonX[lineReady - 1], polygonY[lineReady - 1]);
context.strokeStyle = '#000000';
context.lineTo(x, y);
context.stroke();
whileLineX = x;
whiteLineY = y;
}
});
$("#body").bind('click', function (ev) {
var offset = $('#body').offset();
var x = ev.clientX - offset.left;
var y = ev.clientY - offset.top;
polygonX
.push(x);
polygonY.push(y);
lineReady++;
if (lineReady >= 2) {
var context = $("#canvas")[0].getContext('2d');
context.beginPath();
context.moveTo(polygonX[lineReady - 2], polygonY[lineReady - 2]);
context.lineTo(polygonX[lineReady - 1], polygonY[lineReady - 1]);
context.stroke();
}
});`
最好的方法是使用一些动画。
每次绘制一条线时,都要将其坐标(第一个点和最后一个点)推到数组中。然后在每个动画循环处绘制数组(查看此链接,它将解释如何制作动画)。然后,您需要从数组最后一行的最后一点开始绘制一条线,比如说用红色绘制的线,将线推到鼠标位置。
这样做可以让你在鼠标后面始终有一条红线,让你可以"预览"一条线。
Algo明智的做法是:
var arrayOflines = [];
canvas.onclick ->
var coordinates = mouseposition()
arrayOfLines.push(coordinates)
function mouseposition(){
returns x and y of your mouse on the canvas
}
function draw(array){
loop through array
draw line from array[0] to array[1], then from array[1] to array[2] on canvas
}
function drawPreview(){
draw line from last point of arrayOflines to mouseposition;
}
//so here we are:
function animationloop{
erase your canvas
draw(arrayOfLines); //draw your array
drawPreview(); //draw your 'preview' line
requestAnimationFrame(animationloop); //animate
}
这样做会让你获得一个干净的结果。
相关文章:
- EaseJS拖放;放下(动画CC)电影剪辑的鼠标坐标
- 当鼠标悬停在文本中的单词上时显示警报
- JsFiddle上的鼠标事件不起作用
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何在鼠标悬停时在另一个图像上滑动图像.
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 拆分文本以每隔n个字符添加一行新行,并注意空格
- 动态插入的表:JQuery未检测到最后一行
- 在终端中运行 JavaScript 时(使用 rhino),如何使用 print() 函数在一行中打印
- 如何在Angular UI网格中选择下一行
- 将鼠标旋转限制为特定的度数
- 跟踪jqplot垂直折线图的鼠标位置
- 当我将鼠标悬停在一行上时,如何更改两个表行 css
- html画布鼠标后的一行
- 当鼠标放在一行上时,jqplot会高亮显示该行
- 当鼠标悬停在一行上时,哪个plot.ly json属性可以显示所有悬停数据
- 将鼠标悬停在表中的某一行上时显示按钮
- d3.geo的工具提示.圆形鼠标按下总是显示CSV文件的最后一行
- 如何在鼠标单击事件时从动态表中选择一行
- 显示行详细信息作为弹出/顶部提示窗体鼠标悬停在每一行在KendoUI网格