0

当我播放 Piccolo 演示的缩放示例时,我想知道 Pcanvas 是否只支持拖动动作来缩放?

于是我去查看 Pcanvas 的源代码,然后我发现它有一个变量PZoomEventHandler来控制缩放动作。此外,我查看了 的源代码PZoomEventHandler,我意识到它继承自PDragSequenceEventHandler. 这是否意味着 Pcanvas 仅支持拖动操作来缩放?

如果我是正确的,以下是我的详细信息查询:

  1. 如果我想实现双击动作来缩放,我应该使用 Piccolo 中的哪个类来让 PZoomEventHandler 继承而不是PDragSequenceEventHandler

  2. 如果我更改PZoomEventHandler,肯定会影响所有缩放性能。我 PZoomEventHandlerV2在 Pcanvas 中添加一个变量来通过双击操作来处理特殊缩放会更好吗?

感谢您的时间和建议。:D

4

1 回答 1

1

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());                
        }
    }
}
于 2014-11-20T23:51:55.863 回答