Javascript 如何使用Fabric.js实现画布平移
我有一个Fabric.js画布,我想实现软件包通常使用“手动”工具进行的完整画布平移。这是当你按下一个鼠标按钮,然后在画布上移动,同时按住鼠标按钮,画布的可见部分相应地改变 你可以看到我想要达到的目标 为了实现此功能,我编写了以下代码:Javascript 如何使用Fabric.js实现画布平移,javascript,canvas,fabricjs,panning,Javascript,Canvas,Fabricjs,Panning,我有一个Fabric.js画布,我想实现软件包通常使用“手动”工具进行的完整画布平移。这是当你按下一个鼠标按钮,然后在画布上移动,同时按住鼠标按钮,画布的可见部分相应地改变 你可以看到我想要达到的目标 为了实现此功能,我编写了以下代码: $(canvas.wrapperEl).on('mousemove', function(evt) { if (evt.button == 2) { // 2 is the right mouse button canvas.absolu
$(canvas.wrapperEl).on('mousemove', function(evt) {
if (evt.button == 2) { // 2 is the right mouse button
canvas.absolutePan({
x: evt.clientX,
y: evt.clientY
});
}
});
但它不起作用。你可以看到发生了什么
如何按顺序修改代码:
不确定FabricJS,但可能是这样的:
cursor
属性,使用javascript在mousedown
和mouseup
事件上切换它contextmenu
事件上返回false
var test=document.getElementById('test');
test.addEventListener('mousedown',函数(e){
如果(e.按钮==2){
//如果单击鼠标右键,请将光标形状设置为“抓取”
this.style.cursor='grabbing';
}
});
test.addEventListener('mouseup',function(){
//将光标形状设置为默认值
this.style.cursor='default';
});
test.oncontextmenu=函数(){
//右键单击时禁用关联菜单
返回false;
}
根据鼠标移动平移织物画布的一种简单方法是计算鼠标事件之间的光标位移,并将其传递给relativePan
观察如何使用上一个鼠标事件的screenX
和screenY
属性来计算当前鼠标事件的相对位置:
功能启动面板(事件){
如果(event.button!=2){
返回;
}
var x0=event.screenX,
y0=事件。屏幕显示;
函数continuePan(事件){
var x=event.screenX,
y=event.screenY;
fc.relativePan({x:x-x0,y:y-y0});
x0=x;
y0=y;
}
功能停止(事件){
$(窗口).off('mousemove',continuePan);
$(窗口).off('mouseup',stopPan);
};
$(窗口).mousemove(continuePan);
$(窗口).mouseup(stopPan);
$(窗口).contextmenu(取消菜单);
};
函数取消菜单(){
$(窗口).off('contextmenu',cancelMenu);
返回false;
}
$(画布包装器).mousedown(startPan);
我们在mousedown
上开始平移,然后在mousemove
上继续平移。在mouseup
上,我们取消平移;我们还取消了mouseup
-取消函数本身
右键单击菜单(也称为上下文菜单)通过返回false
来取消。菜单取消功能也会自动取消。因此,如果随后在画布包装器外部单击,则上下文菜单将起作用
以下是一页演示此方法:
您将在织物画布上看到三个图像(加载图像可能需要一两分钟)。您将能够使用标准结构功能。您可以在图像上单击鼠标左键来移动、拉伸和旋转图像。但是,当您在画布容器中单击鼠标右键时,您可以用鼠标平移整个织物画布。我在JSFIDLE上做了一个示例,我们实际上可以将整个画布及其所有对象拖动到父div中,如图所示,我将尝试一步一步地解释它
<div class="content">
<canvas id="c" width="600" height="700" ></canvas>
</div>
canvas.defaultCursor='url(“http://maps.gstatic.com/intl/en_us/mapfiles/openhand_8_8.cur)15,十字准线“代码>
c。覆盖_onMouseDown函数,以更改关闭和光标(在末尾)
fabric.Canvas.prototype.__onMouseUp = function(e){
if(flag){
canvas.defaultCursor = 'url(" http://maps.gstatic.com/intl/en_us/mapfiles/openhand_8_8.cur") 15 15, crosshair';
flag=false;
}
};
$('.content').dragScroll({});
$($scrollArea).mousedown(function (e) {
if (canvas.getActiveObject() || canvas.getActiveGroup()) {
console.log('no drag');return;
} else {
console.log($('body'));
if (typeof options.limitTo == "object") {
for (var i = 0; i < options.limitTo.length; i++) {
if ($(e.target).hasClass(options.limitTo[i])) {
doMousedown(e);
}
}
} else {
doMousedown(e);
}
}
});
.content{
overflow:hidden;
width:400px;
height:400px;
}希望对您有所帮助,祝您好运。我在Github上有一个使用fabric.js画布平移的示例: 负责平移行为的代码如下所示: 它是
fabric.Canvas.prototype
上的一个简单扩展,可用于在画布上切换“拖动模式”,如下所示:
canvas.toggleDragMode(true); // Start panning
canvas.toggleDragMode(false); // Stop panning
看看下面的代码片段,整个代码中都有文档
const STATE_IDLE='IDLE';
const STATE_PANNING=‘PANNING’;
fabric.Canvas.prototype.toggleDragMode=函数(dragMode){
//还记得上次吗
$($scrollArea).mousedown(function (e) {
if (canvas.getActiveObject() || canvas.getActiveGroup()) {
console.log('no drag');return;
} else {
console.log($('body'));
if (typeof options.limitTo == "object") {
for (var i = 0; i < options.limitTo.length; i++) {
if ($(e.target).hasClass(options.limitTo[i])) {
doMousedown(e);
}
}
} else {
doMousedown(e);
}
}
});
function doMousedown(e) {
e.preventDefault();
down = true;
x = e.pageX;
y = e.pageY;
top = e.target.parentElement.parentElement.scrollTop; // .content
left = e.target.parentElement.parentElement.scrollLeft;// .content
}
.content{
overflow:hidden;
width:400px;
height:400px;
canvas.toggleDragMode(true); // Start panning
canvas.toggleDragMode(false); // Stop panning