当我播放短笛演示的缩放示例时,我有一个疑问,即 Pcanvas 仅支持拖动操作进行缩放?
因此,我查看了Pcanvas的源代码,然后我发现它有一个变量PZoomEventHandler
来控制缩放操作。此外,我查看了PZoomEventHandler
的源代码,我意识到它是从PDragSequenceEventHandler
继承而来的。这是否意味着 Pcanvas 仅支持拖动操作进行缩放?
如果我是对的,以下是我的详细信息查询:
如果我想实现双击操作进行缩放,哪个类Piccolo 我应该用来让 PZoomEventHandler 继承自
PDragSequenceEventHandler
?如果我更改
PZoomEventHandler
,肯定会影响所有人变焦性能。我再添加一个变量更好吗 在 Pcanvas 中PZoomEventHandlerV2
以使用双击操作 ?
感谢您的时间和建议。 :D
PDragSequenceEventHandler
简化了基于鼠标拖动事件的处理程序的实现。在您的情况下,您可以从 PBasicInputEventHandler
派生。此外,您可以根据需要添加任意数量的事件侦听器,只需确保它们不会相互干扰即可。在添加用户交互中阅读有关事件侦听器的更多信息。
下面是一个对鼠标滚轮旋转做出反应的缩放处理程序示例(不确定您希望如何在基于双击的缩放中取消缩放,所以我使用了鼠标滚轮)。该示例保留基于拖动的原始缩放处理程序,并根据鼠标滚轮添加新的缩放处理程序。如果需要,还可以使用removeInputEventListener
方法删除原始缩放处理程序。
import java.awt.Dimension;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import edu.umd.cs.piccolo.PCanvas;
import edu.umd.cs.piccolo.PLayer;
import edu.umd.cs.piccolo.event.PBasicInputEventHandler;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.nodes.PPath;
public class TestZoom {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("TestZoom");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
final PCanvas canvas = new PCanvas() {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
};
PLayer layer = new PLayer();
canvas.getCamera().addLayer(0, layer);
canvas.getCamera().getRoot().addChild(layer);
final PPath node = PPath.createRectangle(100, 100, 100, 100);
canvas.getLayer().addChild(node);
canvas.addInputEventListener(new MouseZoomHandler());
frame.add(canvas);
frame.pack();
frame.setVisible(true);
}
});
}
public static class MouseZoomHandler extends PBasicInputEventHandler {
@Override
public void mouseWheelRotated(final PInputEvent event) {
final double scale = 1 - 0.2 * event.getWheelRotation();
final Point2D point = event.getPosition();
event.getCamera().scaleViewAboutPoint(scale,
point.getX(), point.getY());
}
}
}