- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要绘制连接线。例如,对于简单的线条,我需要绘制三 Angular 形、矩形等,并且需要将线条连接到它们的端点。当可以建立连接时,突出显示圆圈会很棒。在我的代码中,我可以绘制线条(就像折线),但我无法将第一条线与最后一条线连接起来。我尝试执行 mouse:over 和 mouse:out 事件,但它们不起作用。
链接到我的代码示例:
https://jsfiddle.net/5gLwL7d3/
这是我的代码:
<canvas id="c" width="500" height="470" style="border:1px solid #ccc"></canvas>
JavaScript
var canvas = new fabric.Canvas('c', { selection: false });
fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center';
var line, isDown, isOver;
var lines = [];
var id = 1;
canvas.on('mouse:down', function(o){
console.log("MOUSE:DOWN");
isDown = true;
var pointer = canvas.getPointer(o.e);
var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
line = new fabric.Line(points, {
strokeWidth: 9,
fill: 'red',
stroke: 'red',
originX: 'center',
originY: 'center'
});
canvas.add(line);
});
canvas.on('mouse:move', function(o){
if (!isDown) return;
var pointer = canvas.getPointer(o.e);
line.set({ x2: pointer.x, y2: pointer.y });
canvas.renderAll();
});
fabric.util.addListener(window,'keyup', function(e) {
console.log("KEYUP :: " + e.keyCode);
if (e.keyCode === 13) {
isDown = false;
}
});
canvas.on('mouse:over', function(e) {
//e.target.setFill('red');
isOver = true;
console.log("MOUSE:OVER");
console.log(e);
});
canvas.on('mouse:out', function(e) {
isOver = false;
console.log("MOUSE:OUT");
});
谢谢!
最佳答案
我为这个问题创建了解决方案。效率上应该有一些改变,但代码运行良好。
var canvas = new fabric.Canvas('c', { selection: false });
fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center';
var circle, line;
var isDown = false;
var isOver = false;
var lines = [];
var circles = [];
var id = 1;
var x2 = 0;
var y2 = 0;
var circleIndex;
var startDraw = false;
canvas.on('mouse:down', function (options) {
isDown = true;
var pointer = canvas.getPointer(options.e);
if (isOver) {
var points = [x2, y2, x2, y2];
} else if (!isOver) {
var points = [pointer.x, pointer.y, pointer.x, pointer.y];
}
if (!isOver || !startDraw) {
line = new fabric.Line(points, {
strokeWidth: 3,
fill: 'red',
stroke: 'red',
originX: 'center',
originY: 'center',
selectable: false
});
circle = new fabric.Circle({
left: line.x1,
top: line.y1,
strokeWidth: 1,
opacity: 0.5,
radius: 10,
fill: 'transparent',
stroke: '#666',
perPixelTargetFind: true,
selectable: false
});
circle.position = "left";
circle.hasControls = circle.hasBorders = false;
circles.push(circle);
canvas.add(circle)
lines.push(line);
circle.lineId = lines.length - 1;
canvas.add(line);
} else {
startDraw = false;
if (circles[circleIndex].position === 'left') {
var points = [lines[circles[circleIndex].lineId].x1,
lines[circles[circleIndex].lineId].y1,
lines[circles[circleIndex].lineId].x1,
lines[circles[circleIndex].lineId].y1];
}
else {
var points = [lines[circles[circleIndex].lineId].x2,
lines[circles[circleIndex].lineId].y2,
lines[circles[circleIndex].lineId].x2,
lines[circles[circleIndex].lineId].y2];
}
line = new fabric.Line(points, {
strokeWidth: 3,
fill: 'red',
stroke: 'red',
originX: 'center',
originY: 'center',
selectable: false
});
canvas.add(line);
lines.push(line);
}
});
canvas.on('mouse:move', function (options) {
var pt = { x: options.e.clientX, y: options.e.clientY };
for (i = 0; i < circles.length; i++) {
if (circles[i].containsPoint(pt)) {
if (!circles[i].mouseOver) {
circles[i].mouseOver = true;
circles[i].set('radius', 12);
circles[i].set('opacity', 1.0);
circles[i].set('selectable', false);
canvas.renderAll();
isOver = true;
circleIndex = i;
if (circles[i].position === 'left') {
x2 = lines[circles[i].lineId].x1;
y2 = lines[circles[i].lineId].y1;
} else {
x2 = lines[circles[i].lineId].x2;
y2 = lines[circles[i].lineId].y2;
}
}
} else if (circles[i].mouseOver) {
circles[i].mouseOver = false;
circles[i].set('opacity', 0.5);
circles[i].set('radius', 10);
circles[i].set('selectable', false);
canvas.renderAll();
isOver = false;
}
}
if (!isDown) {
startDraw = true;
return;
}
startDraw = false;
var pointer = canvas.getPointer(options.e);
if (isOver) {
line.set({ x2: x2, y2: y2 });
} else {
line.set({ x2: pointer.x, y2: pointer.y });
}
canvas.renderAll();
});
fabric.util.addListener(window, 'keyup', function (options) {
if (options.keyCode === 13) {
isDown = false;
if (isOver) {
circles[circleIndex].set('radius', 10);
circles[circleIndex].set('opacity', 0.5);
canvas.renderAll();
line.set({ x2: x2, y2: y2 });
isOver = false;
} else {
canvas.add(line);
circle = new fabric.Circle({
left: lines[lines.length - 1].x2,
top: lines[lines.length - 1].y2,
strokeWidth: 1,
opacity: 0.5,
radius: 10,
fill: 'transparent',
stroke: '#666',
perPixelTargetFind: true,
selectable: false
});
circle.position = "right";
circle.hasControls = circle.hasBorders = false;
circle.lineId = lines.length - 1;
circles.push(circle);
canvas.add(circle);
canvas.renderAll();
}
}
});
关于javascript - Fabricjs绘图时连接线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36896804/
我有如下所示的文本文件: 1. SometextSometextSometextSometextSometext 2. SometextSometextSometextSometextSometext
这一章实现的连接线,目前仅支持直线连接,为了能够不影响原有的其它功能,尝试了2、3个实现思路,最终实测这个实现方式目前来说最为合适了。 请大家动动小手,给我一个免费的 Star 吧~ 大家
假设我的流是 x*N 行长,其中 x 是记录数,N 是每条记录的列数,并且按列输出。例如,x=2,N=3: 1 2 Alice Bob London New York 我如何加入每一行,以记录数为模,
如何在下面的 jsfiddle 中用虚线连接数字。 我希望这些线从内圈的边界开始,无论是来自 jQuery 还是来自 css。我的意思是围绕内圈的边界从内边界边缘开始到数字 ....... 1, ..
我正在使用 C#,但将来我可能需要在其他语言上使用它。 很多游戏都有这样的谜题。有一组电线(有两种类型的电线:直的和弯的。),有一个地方是信号进来的地方,还有一个地方是信号必须离开的地方。但是电线的布
本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线、折线连接线功能。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Is
使用新版本的 Java 物质外观,不绘制典型 JTree 中的连接线(父子线)。 在 java.net 的官方论坛上有人问 same thing开发人员对此的回答是,这是基于较新的 UI 的选择,并且
我正在使用 matplotlib 绘制一些数据,这些数据需要一段时间,因此我必须使用 plot_date 来绘制我的线条。但出于某种原因,就连接线而言,Plot_Date 和 Plot 具有完全不同的
我是一名优秀的程序员,十分优秀!