gpt4 book ai didi

canvas - FabricJS 触摸平移/缩放整个 Canvas

转载 作者:行者123 更新时间:2023-12-02 05:05:58 29 4
gpt4 key购买 nike

我需要在 FabricJS Canvas 上启用触摸缩放/平移。有些库允许在图像上执行此行为(请参阅 pinch-zoom-canvas )或通过鼠标单击事件(请参阅 this Fiddle ),但我似乎无法正确连接“touch:gesture”事件。

我已经构建了启用手势的库(因此 this FabricJS 演示在我本地工作),但我不知道从哪里开始将手势与工作 fiddle 结合起来。

我尝试了这样的代码变体:

    canvas.on({
'touch:gesture': function() {
var text = document.createTextNode(' Gesture ');
info.insertBefore(text, info.firstChild);
// Handle zoom only if 2 fingers are touching the screen
if (event.e.touches && event.e.touches.length == 2) {
// Get event point
var point = new fabric.Point(event.self.x, event.self.y);
// Remember canvas scale at gesture start
if (event.self.state == "start") {
zoomStartScale = self.canvas.getZoom();
}
// Calculate delta from start scale
var delta = zoomStartScale * event.self.scale;
// Zoom to pinch point
self.canvas.zoomToPoint(point, delta);
}

},
'touch:drag': function(e) {
panning = true;
var text = document.createTextNode(' Dragging ');
info.insertBefore(text, info.firstChild);
if (panning && e && e.e) {
debugger;
var units = 10;
var delta = new fabric.Point(e.e.movementX, e.e.movementY);
canvas.relativePan(delta);
}
panning = false;
},
'touch:longpress': function() {
var text = document.createTextNode(' Longpress ');
info.insertBefore(text, info.firstChild);
}
});

但是当我在 iPhone/iPad 上测试时没有任何反应。

最佳答案

捏合缩放是一个愚蠢的错误,我没有将该事件包含在函数参数中。下面的代码适用于捏合/缩放和点击/拖动。

    canvas.on({
'touch:gesture': function(e) {
if (e.e.touches && e.e.touches.length == 2) {
pausePanning = true;
var point = new fabric.Point(e.self.x, e.self.y);
if (e.self.state == "start") {
zoomStartScale = self.canvas.getZoom();
}
var delta = zoomStartScale * e.self.scale;
self.canvas.zoomToPoint(point, delta);
pausePanning = false;
}
},
'object:selected': function() {
pausePanning = true;
},
'selection:cleared': function() {
pausePanning = false;
},
'touch:drag': function(e) {
if (pausePanning == false && undefined != e.e.layerX && undefined != e.e.layerY) {
currentX = e.e.layerX;
currentY = e.e.layerY;
xChange = currentX - lastX;
yChange = currentY - lastY;

if( (Math.abs(currentX - lastX) <= 50) && (Math.abs(currentY - lastY) <= 50)) {
var delta = new fabric.Point(xChange, yChange);
canvas.relativePan(delta);
}

lastX = e.e.layerX;
lastY = e.e.layerY;
}
}
});

绝对约 50px if/then 语句是为了避免拖动远离最后一个点导致 Canvas 跳跃。还暂停平移以便能够独立移动对象。在 github issues thread 中找到了捏合/缩放代码.

关于canvas - FabricJS 触摸平移/缩放整个 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45110576/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com