如何缩放具有固定左上角的节点?

问题描述 投票:0回答:2

这似乎是一个简单的问题。但我没有找到简单的解决方案。如果缩放节点,新窗体将位于父窗体的中心。但我希望新表格具有与旧表格相同的左上角。

示例代码为:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class TestScale extends Application{
    Group root;
    Pane pane;
    Scene scene;    
    Rectangle rect0;

    @Override
    public void start(Stage stage) {
        root = new Group();
        scene = new Scene(root, 200, 160);
        rect0=new Rectangle(0, 0, 200, 160);
        rect0.setFill(Color.BLUE);
        pane = new Pane();           
        pane.getChildren().add(rect0);
        Button btnForward = new Button();
        btnForward.setText(">");
        btnForward.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                transform(pane);
            }
        });
        root.getChildren().add(pane);
        root.getChildren().add(btnForward);
        stage.setScene(scene);
        stage.show();

    }
   

    
    void transform (Node node){
        node.setScaleX(0.5);
        node.setScaleY(0.5);
    }
    
   public static void main(String[] args) {
        launch(args);
    }    
}

使用 Stackpane、Borderpane、Anchorpane、Groups 进行的所有测试都没有提供简单的解决方案。唯一的方法似乎是使用 setTransformX 和 setTransformY。但我需要对参数进行复杂的计算。

javafx transform scale
2个回答
3
投票

当您使用 ScaleX/ScaleY 时,缩放从节点的中心开始。

来自 JavaDocs

发生缩放的枢轴点是未变换的布局边界的中心。

因此,如果要平移缩放坐标,则在设置所需的平移值时需要考虑缩放压缩。

由于您当前的枢轴位于中心,因此您需要将平移设置为负值。由于X和Y的压缩是一半,所以需要转换为场景总大小的1/4。

node.setScaleX(0.5);
node.setScaleY(0.5);
node.setTranslateX(0 - node.getScene().getWidth()/4);     
node.setTranslateY(0 - node.getScene().getHeight()/4);

1
投票

这里是变换图像中的矩形的代码: 该过程为 setScaleX 和 setScaleY(缩放)提供了一个scalefaktor,并为 setTransformX 提供了设置值 tx,为 setTransformY 提供了 ty。

public Scaler(double sceneWidth, double sceneHeight, double imgWidth, double imgHeight, 
            int x, int y, int width, int height) {
        double scrnRatio = sceneHeight / sceneWidth;
        double offsetX = 0.;
        double offsetY = 0.;        
        if (height / (double)width > scrnRatio) {
            offsetX = (height / scrnRatio - width) / 2.;            
            scale = sceneHeight/height;            
        } else {
            offsetY = (width * scrnRatio - height) / 2.;             
            scale = sceneWidth/width;
        }        
        double dh = (1. - scale) / 2.;
        tx = -(x - offsetX) * scale - dh * imgWidth;
        ty = -(y - offsetY) * scale - dh * imgHeight;
    }

有没有更简单的代码?

© www.soinside.com 2019 - 2024. All rights reserved.