当前位置: 首页 > 知识库问答 >
问题:

如何创建只在边框上有阴影的JavaFX透明舞台?

双浩涆
2023-03-14

我读过许多关于透明度和阴影的问题,但我认为我没有看到这个具体的问题得到解决。

我能够成功地创建一个既有透明度又有阴影的窗口,但我不知道如何使颜色阴影不影响透明度颜色。

例如,下面的代码创建了一个具有灰色透明度和红色阴影的窗口。然而,红色也影响了主窗口的透明度,但我只想让阴影延伸到窗口的边框之外。

我的测试代码:

@Override
public void start(Stage stage) throws Exception {
    stage.initStyle(StageStyle.TRANSPARENT);

    StackPane stackPane = new StackPane();

    stackPane.setStyle(
        "-fx-background-color: rgba(255, 255, 255, 0.5);" +
        "-fx-effect: dropshadow(gaussian, red, 50, 0, 0, 0);" +
        "-fx-background-insets: 50;"
    );

    Scene scene = new Scene(stackPane, 450, 450);
    scene.setFill(Color.TRANSPARENT);

    stage.setScene(scene);

    stage.show();
}

共有1个答案

慕璞
2023-03-14

我有一段时间对如何实现这样的阴影效果感到好奇,阴影效果不会通过下面半透明的顶部内容显示出来。

我想出的解决办法是在阴影上使用剪裁,这样它只显示在它正在阴影的半透明内容之外。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.stage.*;
import org.scenicview.ScenicView;

// Java 8 code
public class ClippedShadow extends Application {

    private static final int shadowSize = 50;

    @Override public void start(final Stage stage) {
        stage.initStyle(StageStyle.TRANSPARENT);

        StackPane stackPane = new StackPane(createShadowPane());
        stackPane.setStyle(
                "-fx-background-color: rgba(255, 255, 255, 0.5);" +
                "-fx-background-insets: " + shadowSize + ";"
        );

        Scene scene = new Scene(stackPane, 450, 450);
        scene.setFill(Color.TRANSPARENT);
        stage.setScene(scene);
        stage.show();
    }

    // Create a shadow effect as a halo around the pane and not within
    // the pane's content area.
    private Pane createShadowPane() {
        Pane shadowPane = new Pane();
        // a "real" app would do this in a CSS stylesheet.
        shadowPane.setStyle(
                "-fx-background-color: white;" +
                "-fx-effect: dropshadow(gaussian, red, " + shadowSize + ", 0, 0, 0);" +
                "-fx-background-insets: " + shadowSize + ";"
        );

        Rectangle innerRect = new Rectangle();
        Rectangle outerRect = new Rectangle();
        shadowPane.layoutBoundsProperty().addListener(
                (observable, oldBounds, newBounds) -> {
                    innerRect.relocate(
                            newBounds.getMinX() + shadowSize,
                            newBounds.getMinY() + shadowSize
                    );
                    innerRect.setWidth(newBounds.getWidth() - shadowSize * 2);
                    innerRect.setHeight(newBounds.getHeight() - shadowSize * 2);

                    outerRect.setWidth(newBounds.getWidth());
                    outerRect.setHeight(newBounds.getHeight());

                    Shape clip = Shape.subtract(outerRect, innerRect);
                    shadowPane.setClip(clip);
                }
        );

        return shadowPane;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

相关的

    null
 类似资料:
  • 我创建了一个CircularImageView并提出了以下问题:在android中创建圆形图像视图 在GitHub上下载项目 1)这是CircularImageView类: 您可以使用或下载我的GitHub库CircularImageView,并通过使用gradle dependency进行所有修复:

  • 我想要一些指导方针,如何实现一个幻灯片在过渡的窗格时,用户按下按钮,就像材料设计做它的滑动菜单。 这是一个视频链接,说明了我的需要。 我试过ScaleTransition,TranslateTransition,但他们没有成功。 我想在用户单击按钮时缩小锚窗格。 我错过了什么? ---更新2--- null 这是一个锚格(在其全宽处具有珊瑚色;展开)内的锚格(灰色的根格)。 这就是当你点击菜单按钮

  • 我的fxml文件中只有一个带有ImageView的AnchorPane,其中包含png图像 我到处找了,但找不到任何解决办法,任何帮助都不胜感激。谢谢

  • 问题内容: 我用以下问题创建了CircularImageView:在android中创建圆形图像视图 在GitHub上下载项目 1)这是CircularImageView类: 2)我在我的布局中使用这样的: 你可以通过gradle依赖关系使用或下载带有所有修复程序的GitHub库 CircularImageView: compile ‘com.mikhaellopez:circularimagev

  • 我在“JavaFX:如何为窗格创建动画效果的幻灯片(在透明的舞台内)”上看到过这个问题。 我不明白约翰·阿斯特拉里迪斯最后一条评论中的部分代码。似乎解决了我的问题。我想滑动一个带有影子舞台的窗格。现在我的问题是幻灯片动画播放超出了我的视觉根窗格的限制,它只是与舞台(或实际根窗格)的限制播放。 我的可视根窗格是实际根窗格的子级,我用填充和corlor.transparent设置实际根窗格来实现我的可

  • 在制作网站时,我经常使用透明的png(f.I.创建http://www.noisetexturegenerator.com/)使设计更具材质和真实感。 现在,我正在设计一个也大量使用边框的设计,所以我想知道是否可以以同样的方式添加纹理。(i. o. w.定义一个实心边框并用png覆盖它(png是透明的,因此它必须适应之前指定的实心颜色)) 据我所知,不能用这种方式处理边框图像,因为浏览器会忽略纯色