【问题标题】:Javafx2.2 canvas zoom in and out distortion problemJavafx2.2画布放大缩小失真问题
【发布时间】:2019-03-05 12:59:48
【问题描述】:

我们正在使用 javafx 开发一个可扩展的图形程序。考虑到性能,我们使用 javafx canvas 绘制了很多矩形框。矩形框代表容器的位置。我们发现矩形会出现粗细线条、模糊等。我们的图形需要缩放。矩形框架的计算宽度和坐标将具有浮点数。我们无法通过使用以下帖子来解决问题。 How to draw a crisp, opaque hairline in JavaFX 2.2?

这是我的例子。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class LineScaleTest extends Application {
public static void main(String[] args) { launch(args); }

@Override public void start(Stage stage) {
    AnchorPane anchorPane=new AnchorPane();
    Canvas canvas=new Canvas(500,300);
    canvas.relocate(300,300);
    GraphicsContext gc=canvas.getGraphicsContext2D();
    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,5.5,30,30,0,0);
    }

    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,65.5,30,30,0,0);
    }

    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,115.5,30,30,0,0);
    }

    anchorPane.setOnScroll(new EventHandler<ScrollEvent>() {
        @Override
        public void handle(ScrollEvent e) {
            if (e.getDeltaY() == 0) {
                return;
            }
            double scaleFactor = (e.getDeltaY() > 0) ? 1.1
                    : 1 / 1.1;
            anchorPane.setScaleX(anchorPane.getScaleX() * scaleFactor);
            anchorPane.setScaleY(anchorPane.getScaleY() * scaleFactor);
        }
    });
    anchorPane.getChildren().add(canvas);
    Scene scene = new Scene( anchorPane,1200, 700);
    stage.setScene(scene);
    stage.show();
}
}

示例2############################################# ###############

public class LineScaleTest extends Application {
    public static void main(String[] args) { launch(args); }

    @Override public void start(Stage stage) {
        AnchorPane anchorPane=new AnchorPane();
        Canvas canvas=new Canvas(500,300);
        canvas.relocate(300,300);
        GraphicsContext gc=canvas.getGraphicsContext2D();
        for(int i=0;i<10;i++){
            gc.strokeRoundRect(10.5+35*i,5.5,30,30,0,0);
        }

        for(int i=0;i<10;i++){
            gc.strokeRoundRect(10.5+35*i,65.5,30,30,0,0);
        }

        for(int i=0;i<10;i++){
            gc.strokeRoundRect(10.5+35*i,115.5,30,30,0,0);
        }

        anchorPane.setOnScroll(new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent e) {
                if (e.getDeltaY() == 0) {
                    return;
                }
                double scaleFactor = (e.getDeltaY() > 0) ? 1.1
                        : 1 / 1.1;
                Scale scale=new Scale(anchorPane.getScaleX() * scaleFactor,anchorPane.getScaleY() * scaleFactor);
                Affine reflectTransform = new Affine();
                reflectTransform.append(scale);
                canvas.getTransforms().add(reflectTransform);
            }
        });
        anchorPane.getChildren().add(canvas);
        Scene scene = new Scene( anchorPane,1200, 700);
        stage.setScene(scene);
        stage.show();
    }
}

【问题讨论】:

标签: javafx zooming


【解决方案1】:

您可以为 Canvas 定义仿射变换,而不是缩放 anchorPane。 GraphicsContext 提供了这样做的功能。

【讨论】:

  • 根据你的方法example2,我还是没有达到我想要的结果。 Javafx 对小数坐标和小数宽度没有自动处理机制。摇摆是可能的,还是我的方法不对?
【解决方案2】:

我认为您不能依赖 JavaFX 中内置的任何东西来产生您想要的结果。您的应用程序将需要自行管理以产生所需的结果。因此,您需要自己增加画布宽度和高度,然后根据新尺寸执行重绘,而不是调用“缩放”。然后,您的渲染代码可以确保使用的坐标不会导致模糊或模糊。

【讨论】:

  • 果然我走错方向了,谢谢,通过我们的代码调整已经解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
相关资源
最近更新 更多