首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态背景JavaFX的霜冻玻璃效应

问动态背景JavaFX的霜冻玻璃效应
EN

Stack Overflow用户
提问于 2015-12-09 13:49:11
回答 1查看 4.1K关注 0票数 3

我正在开发一个JavaFX应用程序:

​

​

在这里,我希望左侧窗格具有模糊背景效果,即当用户滚动地图时,左侧窗格后面的内容会发生变化,我希望使用该内容(模糊)作为左窗格的背景。&我差一点就做到了。

每当我滚动Map时,它就会工作,后面的内容也会得到更新,但是在系统监视器中,我可以看到CPU的使用、温度和总功率的急剧上升。

为了实现Frost玻璃效果,我向webEngine(包含地图)添加了一个事件监听器(用于检测鼠标移动):

代码语言:javascript
复制
Document doc = webEngine.getDocument();
((EventTarget) doc).addEventListener("mousemove", listener, false);

侦听器执行以下方法:

  1. 检索左侧窗格(Map)下的实际内容。
  2. 模糊是图像。
  3. 更新屏幕

要更新屏幕,方法将移除左窗格(VBox)和前一个图像(这是背景)。然后,首先添加模糊图像窗格,然后将左窗格添加到根窗格。

因此,我认为我出现性能问题的原因是,当用户拖动Map时,它必须非常迅速地删除并添加窗格(左窗格和背景图像)到根窗格。

问题: CPU使用率很高

那么,在JavaFX中是否还有其他方法,不需要如此高的CPU使用率?

类似的东西,它不需要一直删除和添加窗格。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-09 19:07:45

在HBox中创建两个窗格,将映射相关部分的视图呈现到每个窗格中。在左窗格上设置模糊效果。不需要侦听器、快照或动态添加或删除窗格。

尝试几个不同的模糊效果(有BoxBlur和GuassianBlur)与不同的设置,如果需要,以调整性能特点。

将模糊效果直接设置在左侧窗格上,模糊的所有内容(按钮文本),由于我设置了透明效果,此设置只模糊左侧窗格,

左窗格使用堆栈窗格,左边的映射部分位于堆栈底部(对其应用模糊效果),并在堆栈顶部使用透明覆盖(对其没有影响)。

有没有办法,我可以模糊一个部分的窗格,这样,在左窗格下的部分可以选择&模糊?

是的,您使用的技术类似于:

示例

这里有一个快速的示例,作为概念的证明,很明显,对于您的解决方案,您将需要一些略有不同的东西。

​

​

代码语言:javascript
复制
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.effect.GaussianBlur;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

/**
 * Constructs a scene with a pannable Map background.
 */
public class FrostedPannableView extends Application {
    private Image backgroundImage;

    private static final double W = 800;
    private static final double H = 600;

    @Override
    public void init() {
        backgroundImage = new Image("http://www.narniaweb.com/wp-content/uploads/2009/08/NarniaMap.jpg");
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("Drag the mouse to pan the map");
        stage.setResizable(false);

        // make a transparent pale blue overlay with non transparent blue writing on it.
        final Label label = new Label("Map\nof\nNarnia");
        label.setTextAlignment(TextAlignment.CENTER);
        label.setStyle("-fx-text-fill: midnightblue;  -fx-font: bold italic 40 'serif'; -fx-padding: 0 0 20 0;");

        StackPane glass = new StackPane();
        StackPane.setAlignment(label, Pos.BOTTOM_CENTER);
        glass.getChildren().addAll(label);
        glass.setStyle("-fx-background-color: rgba(0, 100, 100, 0.5);");
        glass.setMaxWidth(W * 1/4);
        glass.setMaxHeight(H);
        StackPane.setAlignment(glass, Pos.CENTER_LEFT);

        // construct a partitioned node with left side blurred.
        ImageView leftMap = new ImageView(backgroundImage);
        ImageView rightMap = new ImageView(backgroundImage);

        // wrap the partitioned node in a pannable scroll pane.
        ScrollPane leftScroll = createScrollPane(leftMap);
        Rectangle leftClip = new Rectangle(W * 1/4, H);
        leftScroll.setClip(leftClip);
        leftScroll.setEffect(new GaussianBlur());

        ScrollPane rightScroll = createScrollPane(rightMap);
        Rectangle rightClip = new Rectangle(W * 1/4, 0, W * 3/4, H);
        rightScroll.setClip(rightClip);

        StackPane composite = new StackPane();
        composite.getChildren().setAll(
                leftScroll,
                rightScroll
        );

        StackPane layout = new StackPane(
                composite,
                glass
        );

        // show the scene.
        Scene scene = new Scene(layout);
        stage.setScene(scene);
        stage.show();

        // bind the scroll values together and center the scroll contents.
        leftScroll.hvalueProperty().bind(rightScroll.hvalueProperty());
        leftScroll.vvalueProperty().bind(rightScroll.vvalueProperty());
        rightScroll.setHvalue(rightScroll.getHmin() + (rightScroll.getHmax() - rightScroll.getHmin()) / 2);
        rightScroll.setVvalue(rightScroll.getVmin() + (rightScroll.getVmax() - rightScroll.getVmin()) / 2);
    }

    /**
     * @return a ScrollPane which scrolls the node.
     */
    private ScrollPane createScrollPane(Node node) {
        ScrollPane scroll = new ScrollPane();
        scroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        scroll.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        scroll.setPannable(true);
        scroll.setMinSize(ScrollPane.USE_PREF_SIZE, ScrollPane.USE_PREF_SIZE);
        scroll.setPrefSize(W, H);
        scroll.setMaxSize(ScrollPane.USE_PREF_SIZE, ScrollPane.USE_PREF_SIZE);
        scroll.setContent(node);
        return scroll;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34180439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档