JavaFX缩放后原点偏移及线条超出边框问题咨询
JavaFX缩放与线条边框问题解答
先看你提供的示例代码:
package pkg; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Line; import javafx.stage.Stage; public class SimpleScalingExample extends Application { @Override public void start(Stage stage) { Pane p = getPane(); Pane root = new Pane(p); Scene scene = new Scene(root, 720, 540); stage.setScene(scene); stage.setTitle("Example"); stage.show(); } public Pane getPane() { Pane pane = new Pane(); double width = 100; double height = 100; pane.setPrefSize(width, height); pane.setStyle("-fx-border-color: black; -fx-border-width: 5;"); // pane.setScaleX(.5); // pane.setScaleY(.8); Line line1 = new Line(0, 0, width, height); line1.setStroke(Color.RED); line1.setStrokeWidth(5); Line line2 = new Line(0, height, width, 0); line2.setStroke(Color.BLUE); line2.setStrokeWidth(5); pane.getChildren().addAll(line1, line2); return pane; } }
1. 缩放后原点偏移的原因
JavaFX中节点的缩放变换默认以自身中心为原点执行。当你取消setScaleX/setScaleY的注释后,pane会以自身中心点为基准缩小,缩放后的整个节点会向四周偏移,导致原本左上角对齐的位置发生偏移。
如果要让缩放以左上角为原点,可修改节点的变换原点:
pane.setTransformOrigin(0, 0);
也可以手动调整布局坐标来抵消偏移量。
2. 线条超出边框的原因
这是因为线条的描边宽度是居中绘制的。比如你设置strokeWidth=5,线条会有2.5像素在路径的外侧,2.5像素在内侧。
同时,你给pane设置了5像素的边框,边框绘制在节点的布局边界上,而你绘制的线条从(0,0)、(0,height)这些节点边界坐标开始,线条的外侧描边就会超出边框范围,看起来像是“溢出”了。
解决这个问题可以调整线条的起始/结束坐标,把边框宽度和描边宽度的一半算进去:
double borderWidth = 5; double strokeHalf = line1.getStrokeWidth() / 2; double offset = borderWidth + strokeHalf; Line line1 = new Line(offset, offset, width - offset, height - offset); Line line2 = new Line(offset, height - offset, width - offset, offset);
内容的提问来源于stack exchange,提问作者Will Hartung
相关产品推荐
相关产品推荐

