如何使用 paperjs 平移
How to pan using paperjs
我一直在尝试弄清楚如何 pan/zoom 在 paperjs 中使用 onMouseDrag 和 onMouseDown。
我看到的唯一参考是coffescript,并没有使用paperjs工具。
我花了比应该弄明白的时间更长的时间。
var toolZoomIn = new paper.Tool();
toolZoomIn.onMouseDrag = function (event) {
var a = event.downPoint.subtract(event.point);
a = a.add(paper.view.center);
paper.view.center = a;
}
你可以进一步简化 Sam P 的方法:
var toolPan = new paper.Tool();
toolPan.onMouseDrag = function (event) {
var offset = event.downPoint - event.point;
paper.view.center = paper.view.center + offset;
};
事件对象已经有一个名为 downPoint
的起点变量。
我已经整理了一个快速 sketch 来测试这个。
不幸的是,您不能依靠 event.downPoint
在更改视图变换时获取前一个点。您必须自己将其保存在视图坐标中(正如 Paper.js 的开发者 Jürg Lehni 所指出的 here)。
这是一个有效的版本(也在 this sketch 中):
let oldPointViewCoords;
function onMouseDown(e) {
oldPointViewCoords = view.projectToView(e.point);
}
function onMouseDrag(e) {
const delta = e.point.subtract(view.viewToProject(oldPointViewCoords));
oldPointViewCoords = view.projectToView(e.point);
view.translate(delta);
}
view.translate(view.center);
new Path.Circle({radius: 100, fillColor: 'red'});
我一直在尝试弄清楚如何 pan/zoom 在 paperjs 中使用 onMouseDrag 和 onMouseDown。
我看到的唯一参考是coffescript,并没有使用paperjs工具。
我花了比应该弄明白的时间更长的时间。
var toolZoomIn = new paper.Tool();
toolZoomIn.onMouseDrag = function (event) {
var a = event.downPoint.subtract(event.point);
a = a.add(paper.view.center);
paper.view.center = a;
}
你可以进一步简化 Sam P 的方法:
var toolPan = new paper.Tool();
toolPan.onMouseDrag = function (event) {
var offset = event.downPoint - event.point;
paper.view.center = paper.view.center + offset;
};
事件对象已经有一个名为 downPoint
的起点变量。
我已经整理了一个快速 sketch 来测试这个。
不幸的是,您不能依靠 event.downPoint
在更改视图变换时获取前一个点。您必须自己将其保存在视图坐标中(正如 Paper.js 的开发者 Jürg Lehni 所指出的 here)。
这是一个有效的版本(也在 this sketch 中):
let oldPointViewCoords;
function onMouseDown(e) {
oldPointViewCoords = view.projectToView(e.point);
}
function onMouseDrag(e) {
const delta = e.point.subtract(view.viewToProject(oldPointViewCoords));
oldPointViewCoords = view.projectToView(e.point);
view.translate(delta);
}
view.translate(view.center);
new Path.Circle({radius: 100, fillColor: 'red'});