当前位置: 首页 > 知识库问答 >
问题:

paper.js有没有办法只缩放画布的一部分而不是整个?

颛孙子民
2023-03-14

我正在构建一个Webtools,其中包含画布内的两个部分:

  • 第一部分用于选择路径

我使用paper.js画布内的所有功能。我为不同的部分制作了两层,并通过跟踪鼠标位置在它们之间切换。

现在,我想在第一部分上实现缩放。我在纸上看到那个视图对象。js具有缩放功能。在google上搜索后,我找到了这个https://gist.github.com/ryascl/4c1fd9e2d5d0030ba429简单缩放的解决方案。

现在是我的问题;如果使用此缩放,整个画布将被放大/缩小。这不是我需要的。我只需要缩放第一部分。有没有办法缩放某个区域或某个图层?

共有1个答案

商柏
2023-03-14

我认为这个问题有两种可能的解决方案:

您可以使用item.scale()而不是使用view.zoom.
直接缩放项目。您可能会遇到的问题是您的图层肯定会重叠,因此您可以将这种方法与group.clipped结合起来以掩盖图层溢出。
这是一个演示此解决方案的草图。

// Draw a line materializing layers separation.
new Path.Line({
    from: view.bounds.topCenter,
    to: view.bounds.bottomCenter,
    strokeColor: 'black'
});

// Draw a rectangle that will be used to crop the layer.
var cropRectangle = new Path.Rectangle({
    from: view.bounds.toLeft,
    to: view.bounds.bottomCenter
});

// Draw a circle in the left part of the screen.
var circle = new Path.Circle({
    center: [view.bounds.leftCenter.x + view.center.x / 2, view.center.y],
    radius: 50,
    fillColor: 'orange'
});

// Create a group that will be used to pan/zoom left part.
var group = new Group([circle]);

// Create left part layer and crop it with the rectangle so that overflow is
// hidden.
var layer = new Layer([cropRectangle, group]);
layer.clipped = true;

// Directly manipulate the group when you want to pan/zoom.
group.translate(view.bounds.width / 4, 0);
group.scale(1.5);

// You can use the same architecture for the right part...

就个人而言,我会使用另一种解决方案,包括管理两个独立的画布,初始化<代码>纸张。js在每一个上生成两个不同的PaperScope实例
然后您将能够控制视图。缩放每个画布<这里有一把小提琴演示这个解决方案。

// Initialize paper scopes.
var scope1 = new paper.PaperScope();
scope1.setup(document.getElementById('canvas1'));

var scope2 = new paper.PaperScope();
scope2.setup(document.getElementById('canvas2'));

// Draw a circle on left canvas.
new paper.Path.Circle({
    center: scope1.view.center,
    radius: 50,
    fillColor: 'orange',
    parent: scope1.project.activeLayer
});

// Draw a circle on right canvas.
new paper.Path.Circle({
    center: scope2.view.center,
    radius: 50,
    fillColor: 'blue',
    parent: scope2.project.activeLayer
});

// Zoom in left canvas.
scope1.view.zoom = 2;

// Zoom out right canvas.
scope2.view.zoom = 0.5;
 类似资料:
  • 我已经开始为绘制温度数据编程这个应用程序,当屏幕调整大小时,画布也应该调整大小。它初始化正确,但当我想调整窗口大小时,draw()方法只会根据它绑定的stackpanes高度值调整高度大小,但它将完全忽略宽度。听者甚至不会开火。这我觉得很奇怪。此外,我必须为StackPane设置最小大小,否则将不会绘制任何东西。我没有使用FXML。 编辑我将第58行从setRight()更改为setCenter,

  • 我已经看到,这在其他类型的对话框窗口中是可能的,如“ShowConfirmDialog”,其中可以指定按钮的数量和它们的名称;但是在使用“ShowInputDialog”时是否可以实现相同的功能?我似乎在API中找不到这种类型的东西。也许我只是错过了,但任何帮助都很感激。

  • 问题内容: 它似乎没有该属性,但是对我来说真的很有用。 问题答案: 你必须改变状态的的小部件从到 之后 进入或:

  • 我的出发点如下: FXML: Java FX控制器:

  • 我在Kubernetes集群中有一个服务和RabbitMQ。我想做的是,我希望服务的不同实例(或副本)在启动时声明一个全新的队列。这些队列将绑定到同一个exchange。 我可以在这里放一个最后的变量吗: 本质上,我只需要一种方法,用生成的名称创建一个队列,然后使用@RabbitListener侦听这个队列。

  • 问题内容: Go的范围可以遍历地图和切片,但是我想知道是否有一种方法可以遍历一系列数字,例如: 还是有一种方法可以像Go语言中的Ruby 类那样在Go中表示整数范围? 问题答案: 您可以并且应该只编写一个for循环。简单,明显的代码就是Go方式。