如何使JavaFX逐渐改变对Image的影响

时间:2015-10-22 09:08:33

标签: javafx-8

在我的JavaFX应用程序中,我在舞台上有一个ImageView。我想添加效果GlowSepia,并且两者都应该在持续时间5秒内逐渐增加(0到1)。

如何使用代码执行此操作? 两种效果应该并行应用。它会让动画更慢吗?

1 个答案:

答案 0 :(得分:4)

在开始时使用Timeline,一个KeyFrame,在结尾使用一个KeyFrame。对于每个 Timeline timeline = new Timeline( new KeyFrame(Duration.ZERO, new KeyValue(glow.levelProperty(), 0), new KeyValue(sepia.levelProperty(), 0)), new KeyFrame(Duration.seconds(5), new KeyValue(glow.levelProperty(), 1), new KeyValue(sepia.levelProperty(),1)) ); ,只需设置每个效果的值:

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.Glow;
import javafx.scene.effect.SepiaTone;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class AnimatedEffects extends Application {

    private static final String IMAGE_URL = "http://www.nasa.gov/sites/default/files/styles/full_width/public/thumbnails/image/nh-charon-neutral-bright-release.jpg?itok=20aE3TAH";

    @Override
    public void start(Stage primaryStage) {
        ImageView image = new ImageView(new Image(IMAGE_URL, 400, 400, true, true));
        Glow glow = new Glow(0);
        SepiaTone sepia = new SepiaTone(0);
        sepia.setInput(glow);
        image.setEffect(sepia);

        Timeline timeline = new Timeline(
            new KeyFrame(Duration.ZERO, 
                    new KeyValue(glow.levelProperty(), 0),
                    new KeyValue(sepia.levelProperty(), 0)),
            new KeyFrame(Duration.seconds(5),
                    new KeyValue(glow.levelProperty(), 1),
                    new KeyValue(sepia.levelProperty(),1))
        );

        Button effectButton = new Button("Add effect");
        effectButton.setOnAction(e -> timeline.play());

        BorderPane root = new BorderPane(image, null, null, effectButton, null);
        BorderPane.setAlignment(effectButton, Pos.CENTER);
        BorderPane.setMargin(effectButton, new Insets(10));
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

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

SSCCE:

{{1}}