JavaFX动画慢动作图像

时间:2017-04-01 12:32:53

标签: javafx javafx-8

我正在尝试制作滚动背景;希望是将它连接到尾部,以便它旋转相同的“色带”,并将其置于游戏的后面。

我一直在寻找正确的方法来实现这一目标。我可以根据我的示例或TimeLine使用AnimationTimer。但是,我希望将动画速度移动得慢得多,并且延迟对计时器的更新会导致抖动。我确实添加了一个int变量,如果小于“x”毫秒,则返回,但它看起来不太好。

完成此任务的更好方法是什么?

import javafx.animation.AnimationTimer;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.layout.*;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

class ImageContainer extends VBox {
    int w, h;
    int sectionScrollWidth = 1;
    int sections;
    int sectionCounter = 0;
    Image image;
    Canvas canvas;

public ImageContainer() {
    setVisible(true);
    load();
    w = (int) image.getWidth();
    h = (int) image.getHeight();
    canvas = new Canvas(w, h);
    getChildren().add(canvas);
    sections = w / sectionScrollWidth;
    GraphicsContext gc = canvas.getGraphicsContext2D();
    canvas.setVisible(true);
    gc.drawImage(image, 0, 0, w, h);
    setPrefSize(w, h);

    final long startNanoTime = System.nanoTime();

    new AnimationTimer() {
        public void handle(long currentNanoTime) {
            sectionCounter = sectionCounter - sectionScrollWidth;
            canvas.setTranslateX(sectionCounter);
        }
    }.start();

//        KeyValue kv1 = new KeyValue(canvas.translateXProperty(), 0);
//        KeyValue kv2 = new KeyValue(canvas.translateXProperty(), 2000);
//        KeyFrame kf1 = new KeyFrame(Duration.millis(3000), kv1, kv2);
//        Timeline translate = new Timeline();
//        translate.getKeyFrames().add(kf1);
//        translate.play();

}

public void load() {
    Path imagePath = Paths.get("./src/main/resources/ribbonImages/clouds.png");
    File f = imagePath.toFile();
    assert f.exists();
    image = new Image(f.toURI().toString());
}
}

1 个答案:

答案 0 :(得分:0)

 if (((System.nanoTime()-startNanoTime)/1000000000.0)<0.05) {
                return;
            }
            else {
                startNanoTime = System.nanoTime();
            }

如果已经过了少于0.05秒,则添加到handle()方法将强制它返回。相当明显的答案,但我不想删除自己的问题,以防其他人帮助。