【问题标题】:Is Pcanvas support double click actions to zoom instead of drag actions?Pcanvas 是否支持双击操作来缩放而不是拖动操作?
【发布时间】:2014-11-20 04:10:20
【问题描述】:

当我播放 Piccolo 演示的缩放示例时,我有一个奇怪的问题是 Pcanvas 只支持拖动动作来缩放?

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

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

  1. 如果我想实现双击动作进行缩放,在哪个类 我应该使用 Piccolo 来让 PZoomEventHandler 继承自 PDragSequenceEventHandler 的?

  2. 如果我更改PZoomEventHandler,肯定会影响所有 变焦性能。我再添加一个变量会更好吗 PZoomEventHandlerV2 在 Pcanvas 中使用 双击操作?

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

【问题讨论】:

    标签: java piccolo


    【解决方案1】:

    PDragSequenceEventHandler 简化了基于鼠标拖动事件的处理程序的实现。在您的情况下,您可以从PBasicInputEventHandler 派生。此外,您可以根据需要添加任意数量的事件侦听器,只要确保它们不会相互干扰。在Adding User Interaction 中阅读有关事件侦听器的更多信息。

    以下是对鼠标滚轮旋转做出反应的缩放处理程序的示例(不确定在基于双击的缩放中如何取消缩放,因此我使用了鼠标滚轮)。该示例保留了基于拖动的原始缩放处理程序,并基于鼠标滚轮添加了一个新缩放处理程序。如果需要,您还可以使用 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());                
            }
        }
    }
    

    【讨论】:

    • 解释得很清楚,感谢Aqua的分享!
    • @ShadowScorpion 欢迎您!我很高兴它有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多