Scale at pivot point in an already scaled node

后端 未结 4 1918
北荒
北荒 2020-12-05 01:19

I\'m trying to create an application with a zoomable/pannable canvas.

Features:

  • zoom in/out with mouse wheel at pivot points
4条回答
  •  生来不讨喜
    2020-12-05 01:45

    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();
    
            }
    
        };
    
    
    }
    

提交回复
热议问题