JavaFX 中的磨砂玻璃效果?

2024-01-16

我正在制作一个 iOS 7 主题的 JavaFX 2/FXML 项目,我想知道如何使 Rectangle 对象具有类似 iOS7 的磨砂玻璃效果。

我还希望它有一个小阴影。这很棘手,因为您可能能够看到半透明物体后面的阴影。我只是希望它出现在边缘。

这可能吗?这是一张显示所需效果的图片(不包括小阴影):

UPDATE: Here's https://stackoverflow.com/questions/22663681/javafx-effect-on-background该问题的延续。这看起来会很棒:D。


示例解决方案

运行下面的程序并滚动或向上滑动以显示玻璃窗格。

该程序的目的只是对所涉及的技术进行采样,而不是充当霜冻效果的通用库。

import javafx.animation.*;
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.geometry.Rectangle2D;
import javafx.scene.*;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.effect.*;
import javafx.scene.image.*;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

// slides a frost pane in on scroll or swipe up; slides it out on scroll or swipe down.
public class Frosty extends Application {

    private static final double W = 330;
    private static final double H = 590;

    private static final double BLUR_AMOUNT = 60;
    private static final Duration SLIDE_DURATION = Duration.seconds(0.4);

    private static final double UPPER_SLIDE_POSITION = 100;

    private static final Effect frostEffect =
        new BoxBlur(BLUR_AMOUNT, BLUR_AMOUNT, 3);

    @Override public void start(Stage stage) {
        DoubleProperty y = new SimpleDoubleProperty(H);

        Node background = createBackground();
        Node frost      = freeze(background, y);
        Node content    = createContent();
        content.setVisible(false);

        Scene scene = new Scene(
                new StackPane(
                        background,
                        frost,
                        content
                )
        );

        stage.setScene(scene);
        stage.show();

        addSlideHandlers(y, content, scene);
    }

    // create a background node to be frozen over.
    private Node createBackground() {
        Image backgroundImage = new Image(
                getClass().getResourceAsStream("ios-screenshot.png")
        );
        ImageView background = new ImageView(backgroundImage);
        Rectangle2D viewport = new Rectangle2D(0, 0, W, H);
        background.setViewport(viewport);

        return background;
    }

    // create some content to be displayed on top of the frozen glass panel.
    private Label createContent() {
        Label label = new Label("The overlaid text is clear and the background below is frosty.");

        label.setStyle("-fx-font-size: 25px; -fx-text-fill: midnightblue;");
        label.setEffect(new Glow());
        label.setMaxWidth(W - 20);
        label.setWrapText(true);

        return label;
    }

    // add handlers to slide the glass panel in and out.
    private void addSlideHandlers(DoubleProperty y, Node content, Scene scene) {
        Timeline slideIn = new Timeline(
                new KeyFrame(
                        SLIDE_DURATION,
                        new KeyValue(
                                y,
                                UPPER_SLIDE_POSITION
                        )
                )
        );

        slideIn.setOnFinished(e -> content.setVisible(true));

        Timeline slideOut = new Timeline(
                new KeyFrame(
                        SLIDE_DURATION,
                        new KeyValue(
                                y,
                                H
                        )
                )
        );

        scene.setOnSwipeUp(e -> {
            slideOut.stop();
            slideIn.play();
        });

        scene.setOnSwipeDown(e -> {
            slideIn.stop();
            slideOut.play();
            content.setVisible(false);
        });

        // scroll handler isn't necessary if you have a touch screen.
        scene.setOnScroll((ScrollEvent e) -> {
            if (e.getDeltaY() < 0) {
                slideOut.stop();
                slideIn.play();
            } else {
                slideIn.stop();
                slideOut.play();
                content.setVisible(false);
            }
        });
    }

    // create a frosty pane from a background node.
    private StackPane freeze(Node background, DoubleProperty y) {
        Image frostImage = background.snapshot(
                new SnapshotParameters(),
                null
        );
        ImageView frost = new ImageView(frostImage);

        Rectangle filler = new Rectangle(0, 0, W, H);
        filler.setFill(Color.AZURE);

        Pane frostPane = new Pane(frost);
        frostPane.setEffect(frostEffect);

        StackPane frostView = new StackPane(
                filler,
                frostPane
        );

        Rectangle clipShape = new Rectangle(0, y.get(), W, H);
        frostView.setClip(clipShape);

        clipShape.yProperty().bind(y);

        return frostView;
    }

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

源图片

将此图像与 Java 源并行保存为名为的文件ios-screenshot.png并让您的构建系统将其复制到构建的二进制输出的目标目录。

附加问题的答案

“JDK 8”,这会是这个的要求吗?

上面的示例代码是针对 JDK 8 编写的。通过用匿名内部类替换 lambda 调用将其移植回 JDK 7 非常简单。

一般来说,Java 7 对于 JavaFX 工作来说已经相当过时了。我建议您尽早升级以使用 Java 8 最低版本。

用参数启动你的窗格

对于大多数父节点来说更方便的构造函数是Java 8 功能 http://docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/StackPane.html#StackPane-javafx.scene.Node...-。您可以轻松转换 Java 8 格式:

 StackPane stack = new StackPane(child1, child2);

对于 Java 7:

 StackPane stack = new StackPane();
 stack.getChildren().setAll(child1, child2);

如果桌面位于结霜的窗格后面,这会起作用吗?

不直接,您可以为此创建一个新问题。

更新:相关问题

用户创建:JavaFX 对背景的影响 https://stackoverflow.com/questions/22663681/javafx-effect-on-background允许磨砂效果应用于桌面背景上的窗口。

另一位用户创建了:如何创建仅在边框上有阴影的 JavaFX 透明舞台? https://stackoverflow.com/questions/25534204/how-do-i-create-a-javafx-transparent-stage-with-shadows-on-only-the-border在此窗口周围应用光晕阴影效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 中的磨砂玻璃效果? 的相关文章

  • Android NumberPicker 带字符串

    I have customised the NumberPicker to show text The output is this 当我按 确定 时 我想将 e x 鼠标添加到我的列表 文章 中 我得到的是索引值 int 它由 array
  • JavaEE 8 教程,在 hello1 项目上部署失败

    我正在尝试学习 Java EE 8 我遵循了官方指南https javaee github io tutorial https javaee github io tutorial 但我有这个问题 cargo maven2 plugin 1
  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • 有效地查找正则表达式的所有重叠匹配项

    这是后续与 java 正则表达式匹配的所有重叠子字符串 https stackoverflow com q 11303309 244526 有没有办法让这段代码更快 public static void allMatches String
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • 如何正确配置Tomcat SSLHostConfig?

    我正在按照本教程在 tomcat 中启用 ssl https medium com raupach how to install lets encrypt with tomcat 3db8a469e3d2 https medium com
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • 我们可以在三元运算符(Java)中使用命令吗?

    这是一个工作代码 String a first String b second String object System out println object null a b 但它不是 String a first String b se
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何自定义JProgressBar?

    我正在制作一个启动器 我想要一个自定义的进度栏 我已经做了一些研究 并且可以使用 JavaFX 从未用它做过任何事情 并且可以通过替换 UI 来实现 我正在寻找一个具有圆形边缘和圆形填充的酒吧 像这样的事情 package gui impo
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储

随机推荐

  • Silverlight DependencyProperty.SetCurrentValue 等效项

    我正在寻找相当于 NET 4 的 SL4设置当前值 http msdn microsoft com en us library system windows dependencyobject setcurrentvalue aspxAPI
  • WiX - 在两个不同位置安装相同的文件

    在我的安装程序中 我有两个可选功能 它们是同一软件版本 5 和 6 的插件 他们将相同的文件 相同的名称 相同的二进制内容 安装到应用程序的 plugins 文件夹中 但我有以下错误 C Users FooBar Documents pro
  • 如何将环境变量从 docker-compose 传递到 NodeJS 项目中?

    我有一个 NodeJS 应用程序 我想要调整其大小 该应用程序由两部分组成 服务器部分 运行一个从数据库获取数据的 API 它在端口 3000 上运行 客户端部分 它从服务器部分调用 API 端点 它运行在端口 8080 上 这样 我的客户
  • 有没有办法为嵌套函数生成 pydoc? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种为嵌套函数生成文档 本例中为 pydoc 的方法 这可以用 pydoc 实现吗 用其他工
  • 使用 RegEx 可靠地解析 HTML 元素 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 PHP 解析 HTML 的最佳方法 https stackoverflow com questions 3577641 best methods to parse html with php 我
  • va_list的重用

    我需要对一个进行两次 或更多 次传递va list 我有一个一定大小的缓冲区 我想用 sprintf 向其中写入一个格式化字符串 如果格式化的字符串不适合分配的空间 我想将分配的空间加倍并重复直到适合为止 作为旁注 我希望能够首先计算格式化
  • 显示享受sql的日子[重复]

    这个问题在这里已经有答案了 我的查询是我有两个表 一个称为sec users包含以下字段 pk user name days available 另一个电话solicitud包含以下字段 pk solicitud fk empleado n
  • .arff 文件与 scikit-learn 一起使用吗?

    我想用一个属性关系文件格式 http www cs waikato ac nz ml weka arff html用 scikit learn 来做一些 NLP 任务 这可能吗 如何使用 arff文件与scikit learn 我真的推荐利
  • Zeppelin 上的皮肤可以自定义吗?

    Zeppelin 上的皮肤可以自定义吗 换句话说 把齐柏林飞艇的标志换成别的东西 是的 很有可能 如您所知 Apache Zeppelin 正在孵化 是一个开源项目 因此只需 克隆它来自github com apache incubator
  • 如何检查 Android 4.0+ 中自动旋转屏幕设置是否打开/关闭

    我认为每个 Android 设备都有能力打开 关闭自动旋转功能 通常你可以在以下位置找到它settings gt display gt auto rotate on off 如何从我的应用程序中读取此设置状态 我怎样才能访问这个设置值 如果
  • 根据 Winforms/C# 中的文本量和字体大小确定标签大小

    我想知道是否有更好的方法来解决这个问题 我想调整标签的大小 垂直 以容纳一定数量的文本 我的标签具有固定宽度 在必须换行之前大约 60 个字符宽 大约 495 像素 字体也是固定大小 据我所知是 12 点 但文本不是 我想要做的是当有 换行
  • 批处理脚本 - 以编程方式在 Windows XP 中创建用户

    有没有办法通过批处理脚本在 Windows XP 中创建用户 甚至为其分配管理员 有限用户值 假设用户名是 rased 密码是 passS net user rased pAsS add net localgroup administrat
  • fork()如何知道自己是在子进程还是在父进程? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当执行 fork 系统调用时 处理器转入内核模式 因此 在 fork 调用结束时 会生成一个新进程 其中包含调用进程的几乎所有结构的副
  • 了解 aiohttp.TCPConnector 池和连接限制

    我正在尝试limit and limit per host参数为aiohttp connector TCPConnector 在下面的脚本中 我通过connector aiohttp connector TCPConnector limit
  • 从 EPS 中提取图像数据

    我有一个封装的 PostScript http en wikipedia org wiki Encapsulated PostScript文件似乎只包装了一个图像文件 有没有工具可以从中提取图像数据 convert 将使用ghostscri
  • 发送标头后重定向用户

    据我所知 只要数据已发送到浏览器 那么标头就无法修改 有什么方法 使用 PHP 可以执行重定向以将用户带到另一个页面 显然不使用标头 如果是这样 您能给我指出一些文档吗 决定编写我自己的 php 函数来实现 javascript 重定向 请
  • 是否可以在 WPF 中使用 ReactiveUI 绑定仅通过 INotifyDataErrorInfo 验证用户输入?

    我们在 Net Core WPF 应用程序中使用 ReactiveUI WPF 11 0 1 我们正在考虑将所有基于 XAML 的绑定替换为基于 ReactiveUI 的绑定 域类型有一个 ViewModel 实现了 INotifyProp
  • Ruby on Rails 的隐藏功能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • UIImageWriteToSavedPhotosAlbum() 不保存裁剪后的图像

    我正在尝试将裁剪后的图像保存到相机胶卷中 我需要以编程方式完成 我不能让用户编辑它 这是我的 仍然很基本 剪切和保存代码 void cutAndSaveImage UIImage rawImage CIImage workingImage
  • JavaFX 中的磨砂玻璃效果?

    我正在制作一个 iOS 7 主题的 JavaFX 2 FXML 项目 我想知道如何使 Rectangle 对象具有类似 iOS7 的磨砂玻璃效果 我还希望它有一个小阴影 这很棘手 因为您可能能够看到半透明物体后面的阴影 我只是希望它出现在边