I\'m trying to create an application with a zoomable/pannable canvas.
Features:
I change your SceneGestures class so now working.
class SceneGestures {
private double oldx;
private double oldy;
double ttx=0;
double tty=0;
private static final double MAX_SCALE = 10.0d;
private static final double MIN_SCALE = .1d;
private DragContext sceneDragContext = new DragContext();
PannableCanvas canvas;
public SceneGestures( PannableCanvas canvas) {
this.canvas = canvas;
}
public EventHandler getOnMousePressedEventHandler() {
return onMousePressedEventHandler;
}
public EventHandler getOnMouseDraggedEventHandler() {
return onMouseDraggedEventHandler;
}
public EventHandler getOnScrollEventHandler() {
return onScrollEventHandler;
}
private EventHandler onMousePressedEventHandler = new EventHandler() {
public void handle(MouseEvent event) {
// right mouse button => panning
if( !event.isSecondaryButtonDown())
return;
sceneDragContext.mouseAnchorX = event.getSceneX();
sceneDragContext.mouseAnchorY = event.getSceneY();
sceneDragContext.translateAnchorX = canvas.getTranslateX();
sceneDragContext.translateAnchorY = canvas.getTranslateY();
}
};
private EventHandler onMouseDraggedEventHandler = new EventHandler() {
public void handle(MouseEvent event) {
// right mouse button => panning
if( !event.isSecondaryButtonDown())
return;
canvas.setTranslateX(sceneDragContext.translateAnchorX + event.getSceneX() - sceneDragContext.mouseAnchorX);
canvas.setTranslateY(sceneDragContext.translateAnchorY + event.getSceneY() - sceneDragContext.mouseAnchorY);
event.consume();
}
};
/**
* Mouse wheel handler: zoom to pivot point
*/
private EventHandler onScrollEventHandler = new EventHandler() {
@Override
public void handle(ScrollEvent event) {
double delta = 1;
double scale = canvas.getScale(); // currently we only use Y, same value is used for X
double oldScale = scale;
if (event.getDeltaY() < 0)
scale -= delta;
else
scale += delta;
if (scale <= MIN_SCALE) {
scale = MIN_SCALE;
} else if (scale >= MAX_SCALE) {
scale = MAX_SCALE;
}
if (oldx==0){
ttx=event.getSceneX() ;
tty=event.getSceneY() ;
}else{
if (oldx!=event.getSceneX()){
ttx=((event.getSceneX()+oldx)/2) ;
}
if (oldy!=event.getSceneY()){
tty=((event.getSceneY()+oldy)/2);
}
}
// pivot value must be untransformed, i. e. without scaling
canvas.setPivot(
((ttx- canvas.getBoundsInParent().getMinX()) / oldScale),
((tty- canvas.getBoundsInParent().getMinY()) / oldScale)
);
// if (oldx==0){
oldx=event.getSceneX();
oldy=event.getSceneY();
// }
//try {
// Robot rbt=new Robot();
// rbt.mouseMove(512, 384);
//} catch (AWTException ex) {
// System.out.println(ex.getMessage());
// }
canvas.setScale( scale);
System.out.println( "new pivot x: " + canvas.scaleTransform.getPivotX() + "/" + canvas.scaleTransform.getPivotY() + ", new scale: " + scale);
System.out.println( "bounds: " + canvas.getBoundsInParent());
System.out.println( "old: " + oldx+" "+oldy);
System.out.println( "tt: " + ttx+" "+tty);
event.consume();
}
};
}