这听起来像是使用 Java 9 中添加的 Node 的 viewOrder 属性的完美情况。viewOrder 控制如何绘制 Nodes 与相同 @987654330 的其他 Nodes 的关系@ 不改变子列表中Nodes 的顺序。这是 Javadoc:
定义此节点在其父节点中的渲染和选取顺序。
此属性用于更改渲染和拾取顺序
其父节点中的节点,而无需重新排序父节点的子列表。
例如,这可以作为一种更有效的方式来实现
透明排序。为此,应用程序可以分配
每个节点的 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]);
}
}
它使用Rectangles 而不是ImageViews,但概念是一样的。当鼠标悬停在Rectangle 上时,它会将视图顺序设置为低于其他顺序,然后播放ScaleTransition 以使其更大。当鼠标退出时,它会将视图顺序重置回0,然后反转ScaleTransition。
注意:我使用了 Java 10 中添加的 var 关键字。
下面是实际示例的 GIF:
编辑:既然你提到了 CSS,我就去检查是否可以从样式表中设置视图顺序。它似乎可以。查看CSS Reference Guide,有一个为Node 定义的名为-fx-view-order 的CSS 属性。