【发布时间】: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();
}
}
【问题讨论】:
-
缩放后0.5的坐标一定不能存在,否则会不准确
-
请edit您的问题添加minimal reproducible example来演示问题。
-
示例已编辑。谢谢