缩放画布后,JavaFX重置图形上下文

时间:2015-06-25 05:28:01

标签: graphics javafx overlay

我正在尝试制作一个不使用任何第三方库的图表。我有一个可以正确缩放Canvas的缩放功能,但现在我需要再次重绘画布内的所有内容。

但是当我缩放GrapphicsContext时也会缩放和印迹。我想重新调整污点并在缩放后在正常绘图中显示点。我怎样才能做到这一点?

以下是我正在重绘的简单代码段:

private void redrawImage(Canvas canvas, int scale) {
      GraphicsContext gc = canvas.getGraphicsContext2D();
      gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
      gc.scale(scale, scale);
      gc.setStroke(Color.RED);
      gc.setLineWidth(2);
      gc.strokeRect(0, 0, canvas.getWidth(), canvas.getHeight());
      gc.setStroke(Color.GREEN);
      gc.strokeLine(0, 0, canvas.getWidth(), canvas.getHeight());
      gc.strokeLine(0, canvas.getHeight(), canvas.getWidth(), 0);
      gc.setStroke(Color.BLUE);
      gc.strokeText("TEXT", 50, 50);

  }

即使我删除gc.scale(X,Y)我仍然看到斑点或文字,我希望刻度始终为1,但我也应该同时缩放或缩放。

我想要实现的是 GoogleMaps 覆盖,您可以看到放大或缩小时的对象经过重新校准并调整到可查看的比例。这正是我想要实现的目标。

1 个答案:

答案 0 :(得分:0)

我不知道我是否理解你是对的。

你的redrawImage方法应该得到一个double,而不是一个int值。即使你试图扩展到1.9,从double到int的强制转换也会降低到1.

我做了一个例子:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class JavaFXApplication1 extends Application {

  @Override
  public void start(Stage primaryStage) {

    Canvas canvas = new Canvas(100, 100);
    Canvas canvas2 = new Canvas(100, 100);

    FlowPane root = new FlowPane();
    root.getChildren().addAll(canvas, canvas2);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
    redrawImage(canvas, 0.5);
    redrawImage(canvas2, 1);
  }

  private void redrawImage(Canvas canvas, double scale) {
    GraphicsContext gc = canvas.getGraphicsContext2D();
    gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
    gc.scale(scale, scale);
    gc.setStroke(Color.RED);
    gc.setLineWidth(2);
    gc.strokeRect(0, 0, canvas.getWidth(), canvas.getHeight());
    gc.setStroke(Color.GREEN);
    gc.strokeLine(0, 0, canvas.getWidth(), canvas.getHeight());
    gc.strokeLine(0, canvas.getHeight(), canvas.getWidth(), 0);
    gc.setStroke(Color.BLUE);
    gc.strokeText("TEXT", 50, 50);
  }

  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    launch(args);
  }

}

具有以下结果:

enter image description here