JavaFX对背景的影响
我正在使用它制作一个带有磨砂玻璃效果的iOS主题JavaFX2(Java7)应用程序。问题是此代码在ImageView上使用其效果。我希望它能对窗户后面的任何东西产生效果,比如: 有什么办法吗?我也喜欢你在上图中看到的小阴影效果 说得清楚一点,我不想要那个滑动条或任何东西,只想要透过窗户看东西的效果,边缘有轻微的阴影。不过,我想用它来代替aeroJavaFX对背景的影响,java,user-interface,javafx,blur,dropshadow,Java,User Interface,Javafx,Blur,Dropshadow,我正在使用它制作一个带有磨砂玻璃效果的iOS主题JavaFX2(Java7)应用程序。问题是此代码在ImageView上使用其效果。我希望它能对窗户后面的任何东西产生效果,比如: 有什么办法吗?我也喜欢你在上图中看到的小阴影效果 说得清楚一点,我不想要那个滑动条或任何东西,只想要透过窗户看东西的效果,边缘有轻微的阴影。不过,我想用它来代替aero 这可能很重要:我使用的是的修改版本。不透明度是Node的一个属性,Node是JavaFX中显示在屏幕上的内容的父类 因此,您可以在想要淡入的对象上设
这可能很重要:我使用的是的修改版本。不透明度是Node的一个属性,Node是JavaFX中显示在屏幕上的内容的父类 因此,您可以在想要淡入的对象上设置不透明度。然后必须添加某种方式来更改所需对象的不透明度。使用图像中的滑块是一种方法,但还有其他方法
可以使用DropShadow效果来完成放置阴影。我从来没用过。这有点高,但如果评论中有后续问题,我可以帮助回答。依赖操作系统的窗口装饰所需的视觉效果只能通过操作系统提供的API实现。因此被下面的
StageStyle.TRANSPARENT
排除
对于JavaFX内容本身,您可以控制stage>scene>根窗格
层次结构的视觉效果。舞台和场景不支持(也不旨在)高级样式,因此通过将下面的设置设置为“透明”来消除
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
root.setStyle("-fx-background-color: null;");
root.setPadding(new Insets(10));
DoubleProperty doubleProperty = new SimpleDoubleProperty(0);
Region region = new Region();
region.styleProperty().bind(Bindings
.concat("-fx-background-radius:20; -fx-background-color: rgba(56, 176, 209, ")
.concat(doubleProperty)
.concat(");"));
region.setEffect(new DropShadow(10, Color.GREY));
Slider slider = new Slider(0, 1, .3);
doubleProperty.bind(slider.valueProperty());
root.getChildren().addAll(region, slider);
primaryStage.initStyle(StageStyle.TRANSPARENT);
Scene scene = new Scene(root, 300, 250);
scene.setFill(Color.TRANSPARENT);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
但是,阴影效果与背景色的alpha值不匹配。您可以通过将阴影的颜色更改为另一种对比度颜色来观察它
输出:相关问题
// copy a background node to be frozen over.
private Image copyBackground(Stage stage) {
final int X = (int) stage.getX();
final int Y = (int) stage.getY();
final int W = (int) stage.getWidth();
final int H = (int) stage.getHeight();
final Screen screen = Screen.getPrimary();
try {
Robot rbt = com.sun.glass.ui.Application.GetApplication().createRobot();
Pixels p = rbt.getScreenCapture(
(int)screen.getBounds().getMinX(),
(int)screen.getBounds().getMinY(),
(int)screen.getBounds().getWidth(),
(int)screen.getBounds().getHeight(),
true
);
WritableImage dskTop = new WritableImage((int)screen.getBounds().getWidth(), (int)screen.getBounds().getHeight());
dskTop.getPixelWriter().setPixels(
(int)screen.getBounds().getMinX(),
(int)screen.getBounds().getMinY(),
(int)screen.getBounds().getWidth(),
(int)screen.getBounds().getHeight(),
PixelFormat.getByteBgraPreInstance(),
p.asByteBuffer(),
(int)(screen.getBounds().getWidth() * 4)
);
WritableImage image = new WritableImage(W,H);
image.getPixelWriter().setPixels(0, 0, W, H, dskTop.getPixelReader(), X, Y);
return image;
} catch (Exception e) {
System.out.println("The robot of doom strikes!");
e.printStackTrace();
return null;
}
}
添加了小阴影的结果:
DropShadow shdw = new DropShadow();
shdw.setBlurType(BlurType.GAUSSIAN);
shdw.setColor(Color.GAINSBORO);
shdw.setRadius(10);
shdw.setSpread(0.12);
shdw.setHeight(10);
shdw.setWidth(10);
layout.setEffect(shdw);
那张图片与我需要的代码无关。它只是显示了我所说的“在窗口后面”的意思。我的意思是,我希望Java窗口后面的任何东西都能使用DropShadow的效果。此外,DropShadow也会应用在窗口后面。如果窗户是不透明的,你可以看到它后面的阴影。啊,我明白了。所以Java窗口后面的对象不在JavaFX的控制之下,它实际上只是操作系统桌面的一部分?是的!我不知道该怎么办!可以控制窗口的不透明度。我做到了。只是在边缘周围添加阴影比较棘手。此外,我放置的链接通过对图像应用效果来起作用。我需要知道如何在动态背景下做到这一点。哈哈。你又这么做了:D.幸好在赏金结束前几秒钟我给了你奖品。我在那里吓坏了,嘿!我这样做是为了你可以在FrostyPane上加载任何节点,并在窗口不对焦时关闭模糊(以使其始终保持一致)。我有几个问题:1。我删除了将所有内容暂停50毫秒的代码,它仍然可以正常工作。有什么我遗漏的吗?2.拖动窗口将重新启动我正在执行的所有功能。例如,当我移动窗口时,启动屏幕将重新启动。有办法吗?还有,是否有任何方法可以轻松实现大小调整?我想我能处理它,但我只是想知道你是否知道任何捷径。不幸的是,如果背景改变,玻璃效果将不会重画。否则,看起来很棒。@jewelsea line 69“末日机器人攻击!”这个答案也是正确的。我怎么对他们两个说“是”呢。。。?
DropShadow shdw = new DropShadow();
shdw.setBlurType(BlurType.GAUSSIAN);
shdw.setColor(Color.GAINSBORO);
shdw.setRadius(10);
shdw.setSpread(0.12);
shdw.setHeight(10);
shdw.setWidth(10);
layout.setEffect(shdw);