这听起来像是使用Java 9 中添加的viewOrder
属性的完美情况。控制如何在不改变子列表中 s的顺序的情况下相对于其他s绘制s。这是Javadoc:Node
viewOrder
Node
Node
Parent
Node
定义此节点在其父节点中的渲染和拾取顺序。
此属性用于更改其父节点中节点的呈现和选取顺序,而无需重新排序父节点的子列表。例如,这可以用作实现透明度排序的更有效方式。为此,应用程序可以将每个节点的 viewOrder 值分配给该节点与查看器之间的计算距离。
父级将以递减的 viewOrder 顺序遍历其子级。这意味着 viewOrder 较低的孩子将在 viewOrder 较高的孩子前面。如果两个孩子有相同的viewOrder,则父母会按照他们在父母孩子列表中出现的顺序遍历它们。
但是,viewOrder 不会改变此节点在其父节点中的布局和焦点遍历顺序。在进行布局或焦点遍历时,父级总是按顺序遍历其子级列表。
这是使用此属性的示例:
import javafx.animation.ScaleTransition;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.util.ArrayList;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
var box = new HBox(createRectangles(Color.DARKBLUE, Color.FIREBRICK, 25));
box.setAlignment(Pos.CENTER);
box.setPadding(new Insets(50, 20, 50, 20));
primaryStage.setScene(new Scene(box));
primaryStage.show();
}
private Rectangle[] createRectangles(Color start, Color end, int count) {
var list = new ArrayList<Rectangle>(count);
for (double i = 0; i < count; i++) {
var rect = new Rectangle(30, 60, start.interpolate(end, i / count));
var scaleTrans = new ScaleTransition(Duration.millis(250), rect);
scaleTrans.setFromX(1.0);
scaleTrans.setFromY(1.0);
scaleTrans.setToX(1.2);
scaleTrans.setToY(1.2);
rect.setOnMouseEntered(e -> {
scaleTrans.stop(); // <--- doesn't seem necessary*
scaleTrans.setRate(1.0);
rect.setViewOrder(-1.0);
scaleTrans.play();
});
rect.setOnMouseExited(e -> {
scaleTrans.stop(); // <--- doesn't seem necessary*
scaleTrans.setRate(-1.0);
rect.setViewOrder(0.0);
scaleTrans.play();
});
// *the "stop()"'s don't seem to be necessary. When I commented
// them out the animation still worked. In fact, the animation
// actually seems smoother in the situation where you move the
// mouse over and then away quickly (before the zoom-in completes).
list.add(rect);
}
return list.toArray(new Rectangle[0]);
}
}
它使用Rectangle
s 而不是ImageView
s,但概念是相同的。当鼠标悬停在 aRectangle
上时,它会将视图顺序设置为低于其他顺序,然后播放 aScaleTransition
以使其更大。当鼠标退出时,它会将视图顺序重置为0
然后反转ScaleTransition
.
注意:我使用了var
Java 10 中添加的关键字。
这是一个实际示例的 GIF:
编辑:既然你提出了 CSS,我就去检查是否可以从样式表中设置视图顺序。它似乎可以。查看CSS 参考指南,有一个为Node
named定义的 CSS 属性-fx-view-order
。