我在将翻译和缩放同时应用于JavaFx Path node时遇到了一些问题。我发现无论何时通过调用setScaleX()或scaleY()来应用比例,通过调用relocate()应用的任何翻译都不会很久。
例如,使用此主类:
MyRegion
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.shape.ClosePath;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
public class MyRegion extends Region{
private Path pointer;
private ObjectProperty<Color> pointerColour =
new SimpleObjectProperty<>(Color.ORANGE);
public MyRegion() {
initGraphics();
}
private void initGraphics(){
pointer = new Path();
pointer.setFill(pointerColour.get());
pointer.setStrokeWidth(0);
pointer.getElements().add(new MoveTo(50, 50));
pointer.getElements().add(new LineTo(50, 200));
pointer.getElements().add(new LineTo(200, 200));
pointer.getElements().add(new ClosePath());
pointer.relocate(70, 70);
}
@Override
protected void layoutChildren() {
getChildren().removeAll(pointer);
getChildren().addAll(pointer);
}
@Override
protected double computePrefHeight(double width) {
return 200;
}
@Override
protected double computePrefWidth(double height) {
return 200;
}
}
类:
pointer.relocate(70, 70)
这会产生一个三角形,位于方法initGraphics()
中private void initGraphics(){
pointer = new Path();
pointer.setFill(pointerColour.get());
pointer.setStrokeWidth(0);
pointer.getElements().add(new MoveTo(50, 50));
pointer.getElements().add(new LineTo(50, 200));
pointer.getElements().add(new LineTo(200, 200));
pointer.getElements().add(new ClosePath());
pointer.relocate(70, 70);
pointer.setScaleX(2);
pointer.setScaleY(2);
}
行所设置的共同坐标(70,70)处:
如果我现在将X和Y缩放因子添加到Path中,那么`initGraphics()现在看起来像:
(0,0)
以下结果,不符合我的预期:
因此,三角形的大小已按预期缩放,但它是从MoveTo()
中提取的。这几乎就像在Path
中忽略了PathElement
对象。
在创建Path期间调用scale方法的位置无关紧要,结果是相同的。我也尝试将第一个MoveTo(0,0)
设置为survival
,但结果是一样的。
我是否误解了这些方法调用是如何工作的还是JavaFx节点中的错误?
答案 0 :(得分:1)
当您在节点上应用scaleX
/ scaleY
时,会将其应用于其中心:
定义沿{@code Node}的X轴围绕对象中心缩放坐标的因子。
缩放发生的轴心点是未转换的{@link #layoutBoundsProperty layoutBounds}的中心。
至于relocate
:
设置节点的layoutX和layoutY转换属性,以便将此节点重定位到父节点中的x,y位置。 此方法不会更改translateX或translateY ,如果也设置,则会将其添加到layoutX和layoutY,并按相应的金额调整最终位置。
(大胆的我的)
在您的第一种情况下,如您所说,路径将重新定位到(70,70),但在第二种情况下,使用比例, 重新定位到(70,70) ,中心位于(145,145),其大小为300x300,这意味着左上顶点将位于(145,145) - (150,150)=( - 5,-5)。
这是边界框的结果:
System.out.println(pointer.getBoundsInParent());
>> BoundingBox [minX:-5.5, minY:-5.5, minZ:0.0, width:302.0, height:302.0, depth:0.0, maxX:296.5, maxY:296.5, maxZ:0.0]
(它为路径的中风增加了1个px)。
所以它正在做它应该做的事情。
如果您希望路径从(70,70)缩放,请将其左上顶点作为 pivot ,并使用Scale
变换:
private void initGraphics(){
pointer = new Path();
pointer.setFill(pointerColour.get());
pointer.setStrokeWidth(0);
pointer.getElements().add(new MoveTo(50, 50));
pointer.getElements().add(new LineTo(50, 200));
pointer.getElements().add(new LineTo(200, 200));
pointer.getElements().add(new ClosePath());
pointer.relocate(70, 70);
pointer.getTransforms().add(new Scale(2, 2, 50, 50));
}