应用比例时,路径转换不受尊重

时间:2016-05-21 15:06:31

标签: java javafx javafx-8

我在将翻译和缩放同时应用于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)处:

Working example

如果我现在将X和Y缩放因子添加到Path中,那么`initGraphics()现在看起来像:

(0,0)

以下结果,不符合我的预期:

enter image description here

因此,三角形的大小已按预期缩放,但它是从MoveTo()中提取的。这几乎就像在Path中忽略了PathElement对象。

在创建Path期间调用scale方法的位置无关紧要,结果是相同的。我也尝试将第一个MoveTo(0,0)设置为survival,但结果是一样的。

我是否误解了这些方法调用是如何工作的还是JavaFx节点中的错误?

1 个答案:

答案 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));
}

scaling