Поддерживает ли Pcanvas действия двойного щелчка для увеличения вместо действий перетаскивания?
Когда я воспроизвел пример масштабирования демонстрации Piccolo, у меня возникло удивление, что Pcanvas поддерживает только перетаскивание для увеличения?
Таким образом, я пошел, чтобы просмотреть исходный код Pcanvas, а затем обнаружил, что он имеет одну переменную PZoomEventHandler
контролировать действия масштабирования. Кроме того, я рассмотрел исходный код PZoomEventHandler
Я понял это наследство от PDragSequenceEventHandler
, Это означает, что Pcanvas поддерживает только перетаскивание для увеличения?
Если я прав, ниже приведены мои подробные запросы:
Если я хочу выполнить действия двойного щелчка для увеличения, какой класс в Piccolo я должен использовать, чтобы позволить наследовать PZoomEventHandler вместо
PDragSequenceEventHandler
?Если я изменю
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());
}
}
}