JavaFX - 深色背景上的多个灯
JavaFX - Multiple lights on a dark background
我正在尝试使用 JavaFX 创建类似迷你地图的东西,即(变暗的)背景图像,上面有一些圆圈。其中一些圆圈需要能够照亮背景,露出一小部分。下图就是我的目的。
我已经使用 this SO solution 继续前进,但目前我卡住了,因为您似乎只能在基础 StackPane
上设置 javafx.scene.effect.Lighting
的一个实例.
我真的很想让它尽可能简单,最好只使用 JavaFX。非常感谢任何帮助:)
我建议使用 BlendMode.LIGHTEN
在具有黑色背景的 Pane
上添加 Circle
并用 RadialGradient
填充,并将其与包含 ImageView
的 ImageView
相结合"map" 使用 BlendMode.MULTIPLY
:
private Circle circle;
// gradient with yellow in the center and black on the border
private final static RadialGradient GRADIENT = new RadialGradient(0, 0, 0.5, 0.5, 0.5, true, CycleMethod.NO_CYCLE, new Stop(0, Color.YELLOW), new Stop(1, Color.BLACK));
private void newCircle(Pane container) {
circle = new Circle(50, GRADIENT);
circle.setBlendMode(BlendMode.LIGHTEN);
circle.setManaged(false);
container.getChildren().add(circle);
}
private void setCirclePosition(MouseEvent event) {
circle.setCenterX(event.getX());
circle.setCenterY(event.getY());
}
@Override
public void start(Stage primaryStage) {
Image image = new Image(imageURL);
ImageView imageView = new ImageView(image);
Pane mask = new Pane();
mask.setBlendMode(BlendMode.MULTIPLY);
mask.setStyle("-fx-background-color: black;");
mask.setOnMouseMoved(this::setCirclePosition); // move cricle with mouse
newCircle(mask);
// create new circle on mouse click
mask.setOnMouseClicked(evt -> {
newCircle(mask);
setCirclePosition(evt);
});
StackPane root = new StackPane(imageView, mask);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
我正在尝试使用 JavaFX 创建类似迷你地图的东西,即(变暗的)背景图像,上面有一些圆圈。其中一些圆圈需要能够照亮背景,露出一小部分。下图就是我的目的。
我已经使用 this SO solution 继续前进,但目前我卡住了,因为您似乎只能在基础 StackPane
上设置 javafx.scene.effect.Lighting
的一个实例.
我真的很想让它尽可能简单,最好只使用 JavaFX。非常感谢任何帮助:)
我建议使用 BlendMode.LIGHTEN
在具有黑色背景的 Pane
上添加 Circle
并用 RadialGradient
填充,并将其与包含 ImageView
的 ImageView
相结合"map" 使用 BlendMode.MULTIPLY
:
private Circle circle;
// gradient with yellow in the center and black on the border
private final static RadialGradient GRADIENT = new RadialGradient(0, 0, 0.5, 0.5, 0.5, true, CycleMethod.NO_CYCLE, new Stop(0, Color.YELLOW), new Stop(1, Color.BLACK));
private void newCircle(Pane container) {
circle = new Circle(50, GRADIENT);
circle.setBlendMode(BlendMode.LIGHTEN);
circle.setManaged(false);
container.getChildren().add(circle);
}
private void setCirclePosition(MouseEvent event) {
circle.setCenterX(event.getX());
circle.setCenterY(event.getY());
}
@Override
public void start(Stage primaryStage) {
Image image = new Image(imageURL);
ImageView imageView = new ImageView(image);
Pane mask = new Pane();
mask.setBlendMode(BlendMode.MULTIPLY);
mask.setStyle("-fx-background-color: black;");
mask.setOnMouseMoved(this::setCirclePosition); // move cricle with mouse
newCircle(mask);
// create new circle on mouse click
mask.setOnMouseClicked(evt -> {
newCircle(mask);
setCirclePosition(evt);
});
StackPane root = new StackPane(imageView, mask);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}