可以使用Nashorn将Javascript中的动画应用到JavaFX对象吗?

可以使用Nashorn将Javascript中的动画应用到JavaFX对象吗?,javascript,java,animation,javafx,nashorn,Javascript,Java,Animation,Javafx,Nashorn,我在JavaFX中有一个Text对象,它充当场景的标题 我可以在所述FX对象上调用动画效果(fadeIn,fadeOut),或者在JS中创建动画队列,然后使用Nashorn将其应用于我的FX对象,并在场景中相应地显示效果吗 示例 使文本对象基于定时循环“脉动”。(在JS中创建的自定义动画) 使用JS中的slideDown函数缓慢展开文本元素 您只需在Nashron中使用javascript程序,即可对任何节点设置动画(fadeIn、fadeOut、slideDown、pulstate等),而无

我在JavaFX中有一个
Text
对象,它充当场景的标题

我可以在所述FX对象上调用动画效果(
fadeIn
fadeOut
),或者在JS中创建动画队列,然后使用Nashorn将其应用于我的FX对象,并在场景中相应地显示效果吗

示例

  • 使文本对象基于定时循环“脉动”。(在JS中创建的自定义动画)

  • 使用JS中的
    slideDown
    函数缓慢展开文本元素

您只需在
Nashron
中使用
javascript
程序,即可对任何节点设置动画(
fadeIn、fadeOut、slideDown、pulstate
等),而无需包装
javascript
程序

FadeIn

private void fadeIn(Node node) {
    FadeTransition fadeTransition = new FadeTransition(
            Duration.millis(900), 
            node
    );
    fadeTransition.setFromValue(0);
    fadeTransition.setToValue(1);
    fadeTransition.play();
}
private void slideDown(Node node) {
    TranslateTransition slideDown = new TranslateTransition(
            Duration.millis(900), 
            node
    );
    slideDown.setFromY(-400);
    slideDown.setToY(0);
    slideDown.play();
}
淡出

private void fadeOut(Node node) {
    FadeTransition fadeTransition = new FadeTransition(
            Duration.millis(900), 
            node
    );
    fadeTransition.setFromValue(1);
    fadeTransition.setToValue(0);
    fadeTransition.play();
}
向下滑动

private void fadeIn(Node node) {
    FadeTransition fadeTransition = new FadeTransition(
            Duration.millis(900), 
            node
    );
    fadeTransition.setFromValue(0);
    fadeTransition.setToValue(1);
    fadeTransition.play();
}
private void slideDown(Node node) {
    TranslateTransition slideDown = new TranslateTransition(
            Duration.millis(900), 
            node
    );
    slideDown.setFromY(-400);
    slideDown.setToY(0);
    slideDown.play();
}
脉动

private void pulsate(Node node) {

    node.setEffect(new DisplacementMap());

    ScaleTransition scaleUp = new ScaleTransition(
            Duration.millis(400), node
    );
    scaleUp.setFromX(1);
    scaleUp.setFromY(1);
    scaleUp.setToX(1.4);
    scaleUp.setToY(1.4);
    scaleUp.play();

    scaleUp.setOnFinished(su -> {
        ScaleTransition scaleDown = new ScaleTransition(
                Duration.millis(400), node
        );
        scaleDown.setFromX(1.4);
        scaleDown.setFromY(1.4);
        scaleDown.setToX(1);
        scaleDown.setToY(1);
        scaleDown.play();
        scaleDown.setOnFinished(sd -> node.setEffect(null));
    });
}
一个使用这些动画的
文本
的简单演示

public class TextAnimationDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(getContent(), 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private BorderPane getContent() {
        Text text = new Text("Title");

        Button fadeIn = new Button("Fade In");
        fadeIn.setOnAction(e -> fadeIn(text));

        Button fadeOut = new Button("Fade Out");
        fadeOut.setOnAction(e -> fadeOut(text));

        Button slideDown = new Button("Slide-Down");
        slideDown.setOnAction(event -> slideDown(text));

        BorderPane root = new BorderPane();
        root.setCenter(text);
        root.setRight(fadeOut);
        root.setLeft(fadeIn);
        root.setBottom(slideDown);
        return root;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
您可以简单地使用任何节点设置动画(
fadeIn、fadeOut、slideDown、pulstate
等),而无需在
Nashron
中包装
javascript
程序

FadeIn

private void fadeIn(Node node) {
    FadeTransition fadeTransition = new FadeTransition(
            Duration.millis(900), 
            node
    );
    fadeTransition.setFromValue(0);
    fadeTransition.setToValue(1);
    fadeTransition.play();
}
private void slideDown(Node node) {
    TranslateTransition slideDown = new TranslateTransition(
            Duration.millis(900), 
            node
    );
    slideDown.setFromY(-400);
    slideDown.setToY(0);
    slideDown.play();
}
淡出

private void fadeOut(Node node) {
    FadeTransition fadeTransition = new FadeTransition(
            Duration.millis(900), 
            node
    );
    fadeTransition.setFromValue(1);
    fadeTransition.setToValue(0);
    fadeTransition.play();
}
向下滑动

private void fadeIn(Node node) {
    FadeTransition fadeTransition = new FadeTransition(
            Duration.millis(900), 
            node
    );
    fadeTransition.setFromValue(0);
    fadeTransition.setToValue(1);
    fadeTransition.play();
}
private void slideDown(Node node) {
    TranslateTransition slideDown = new TranslateTransition(
            Duration.millis(900), 
            node
    );
    slideDown.setFromY(-400);
    slideDown.setToY(0);
    slideDown.play();
}
脉动

private void pulsate(Node node) {

    node.setEffect(new DisplacementMap());

    ScaleTransition scaleUp = new ScaleTransition(
            Duration.millis(400), node
    );
    scaleUp.setFromX(1);
    scaleUp.setFromY(1);
    scaleUp.setToX(1.4);
    scaleUp.setToY(1.4);
    scaleUp.play();

    scaleUp.setOnFinished(su -> {
        ScaleTransition scaleDown = new ScaleTransition(
                Duration.millis(400), node
        );
        scaleDown.setFromX(1.4);
        scaleDown.setFromY(1.4);
        scaleDown.setToX(1);
        scaleDown.setToY(1);
        scaleDown.play();
        scaleDown.setOnFinished(sd -> node.setEffect(null));
    });
}
一个使用这些动画的
文本
的简单演示

public class TextAnimationDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(getContent(), 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private BorderPane getContent() {
        Text text = new Text("Title");

        Button fadeIn = new Button("Fade In");
        fadeIn.setOnAction(e -> fadeIn(text));

        Button fadeOut = new Button("Fade Out");
        fadeOut.setOnAction(e -> fadeOut(text));

        Button slideDown = new Button("Slide-Down");
        slideDown.setOnAction(event -> slideDown(text));

        BorderPane root = new BorderPane();
        root.setCenter(text);
        root.setRight(fadeOut);
        root.setLeft(fadeIn);
        root.setBottom(slideDown);
        return root;
    }

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

您可以从Nashorn制作Javafx动画。我将上面的Java代码由Shekkar Raee移植到nashorn。您可以使用nashorn jjs shell工具运行以下脚本

// Usage: jjs -fx textanimation.js

// JavaFX classes used
var BorderPane = Java.type("javafx.scene.layout.BorderPane")
var Button = Java.type("javafx.scene.control.Button")
var Duration = Java.type("javafx.util.Duration")
var FadeTransitionBuilder = Java.type("javafx.animation.FadeTransitionBuilder")
var Scene = Java.type("javafx.scene.Scene")
var Text = Java.type("javafx.scene.text.Text")
var TranslateTransitionBuilder = Java.type("javafx.animation.TranslateTransitionBuilder")

function start(stage) {
    //target node
    var text = new Text("Title")

    //fade-in animation
    var fadeIn = new Button("Fade In")
    fadeIn.onAction = function(e) {
         var fade1 = FadeTransitionBuilder
                .create()
                .node(text)
                .duration(Duration.millis(900))
                .fromValue(0)
                .toValue(1)
                .build()
         fade1.play()
    }

    //fade-out animation
    var fadeOut = new Button("Fade Out")
    fadeOut.onAction = function(e) {
         var fade2 = FadeTransitionBuilder
                .create()
                .node(text)
                .duration(Duration.millis(900))
                .fromValue(1)
                .toValue(0)
                .build()
         fade2.play()
    }

    //slide-down animation
    var slideDown = new Button("Slide-Down")
    slideDown.onAction = function(event) {
         var slide = TranslateTransitionBuilder.create()
                .node(text).duration(Duration.millis(900))
                .fromY(-400)
                .toY(0)
                .build()
         slide.play()
    }

    var root = new BorderPane()
    root.setCenter(text)
    root.setRight(fadeOut)
    root.setLeft(fadeIn)
    root.setBottom(slideDown)

    var scene = new Scene(root, 300, 250)

    stage.title = "Animation Demo"
    stage.scene = scene
    stage.show()
}

您可以从Nashorn制作Javafx动画。我将上面的Java代码由Shekkar Raee移植到nashorn。您可以使用nashorn jjs shell工具运行以下脚本

// Usage: jjs -fx textanimation.js

// JavaFX classes used
var BorderPane = Java.type("javafx.scene.layout.BorderPane")
var Button = Java.type("javafx.scene.control.Button")
var Duration = Java.type("javafx.util.Duration")
var FadeTransitionBuilder = Java.type("javafx.animation.FadeTransitionBuilder")
var Scene = Java.type("javafx.scene.Scene")
var Text = Java.type("javafx.scene.text.Text")
var TranslateTransitionBuilder = Java.type("javafx.animation.TranslateTransitionBuilder")

function start(stage) {
    //target node
    var text = new Text("Title")

    //fade-in animation
    var fadeIn = new Button("Fade In")
    fadeIn.onAction = function(e) {
         var fade1 = FadeTransitionBuilder
                .create()
                .node(text)
                .duration(Duration.millis(900))
                .fromValue(0)
                .toValue(1)
                .build()
         fade1.play()
    }

    //fade-out animation
    var fadeOut = new Button("Fade Out")
    fadeOut.onAction = function(e) {
         var fade2 = FadeTransitionBuilder
                .create()
                .node(text)
                .duration(Duration.millis(900))
                .fromValue(1)
                .toValue(0)
                .build()
         fade2.play()
    }

    //slide-down animation
    var slideDown = new Button("Slide-Down")
    slideDown.onAction = function(event) {
         var slide = TranslateTransitionBuilder.create()
                .node(text).duration(Duration.millis(900))
                .fromY(-400)
                .toY(0)
                .build()
         slide.play()
    }

    var root = new BorderPane()
    root.setCenter(text)
    root.setRight(fadeOut)
    root.setLeft(fadeIn)
    root.setBottom(slideDown)

    var scene = new Scene(root, 300, 250)

    stage.title = "Animation Demo"
    stage.scene = scene
    stage.show()
}
请注意,root.setCenter(text)root.setRight(fadeOut)root.setLeft(fadeOut)root.setBottom(slideDown)可以表示为root.center=text root.right=fadeOut root.left=fadeIn root.bottom=slideDown注意root.setCenter(text)root.setRight(fadeOut)root.setLeft(fadeIn)root.setBottom(slideDown)可以表示为root.center=text root.right=fadeOut root.left=fadeIn root.bottom=slideDown