Поддерживает ли Pcanvas действия двойного щелчка для увеличения вместо действий перетаскивания?

Когда я воспроизвел пример масштабирования демонстрации Piccolo, у меня возникло удивление, что Pcanvas поддерживает только перетаскивание для увеличения?

Таким образом, я пошел, чтобы просмотреть исходный код Pcanvas, а затем обнаружил, что он имеет одну переменную PZoomEventHandler контролировать действия масштабирования. Кроме того, я рассмотрел исходный код PZoomEventHandlerЯ понял это наследство от PDragSequenceEventHandler, Это означает, что Pcanvas поддерживает только перетаскивание для увеличения?

Если я прав, ниже приведены мои подробные запросы:

  1. Если я хочу выполнить действия двойного щелчка для увеличения, какой класс в Piccolo я должен использовать, чтобы позволить наследовать PZoomEventHandler вместо PDragSequenceEventHandler?

  2. Если я изменю PZoomEventHandlerбезусловно, это повлияет на все масштабирование. Лучше добавить еще одну переменную, какPZoomEventHandlerV2 в Pcanvas для обработки специального масштабирования с помощью действий двойного щелчка?

Спасибо за ваше время и предложение.:D

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());                
        }
    }
}
Другие вопросы по тегам