javafx - 使用时间轴更改ImageView的图像不起作用

时间:2017-10-04 17:10:15

标签: java javafx

我希望使用ImageView作为图像的容器来显示精灵动画,并使用TimeLine来切换图像视图中的图像:

private ImageView imgView;
...
public void init(Image[] images) {
   this.imgView = new ImageView(images[0]);
   Timeline timeLine = new Timeline();
   Collection<KeyFrame> frames = timeLine.getKeyFrames();
   for (Image img : images)
       frames.add(new KeyFrame(Duration.millis(256), e -> imgView.setImage(img)));

   timeLine.setCycleCount(Timeline.INDEFINITE);
   timeLine.play();
}

ImageView已渲染,但卡在动画的某些图像上(甚至不是第一个)。这就像我只将一个图像放入imageview并且永远不会改变它。 我在ImageView的imageproperty中添加了一个ChangeListener,输出了imageview的当前图像。它确实按需要改变,但仍然只渲染一个图像。图像肯定是不同的,我仔细检查。为什么在imageproperty改变时未更新imageview?

1 个答案:

答案 0 :(得分:3)

您对所有关键帧使用相同的时间点,因此imgView.setImage(...)的所有调用都在“同一时间”发生。只有最后一次这样的呼叫才会产生任何明显的效果,因为前面的呼叫之间没有时间。

您需要在不同的时间对图像视图的图像进行每次更改。类似的东西:

public void init(Image[] images) {
    this.imgView = new ImageView(images[0]);
    Timeline timeLine = new Timeline();
    Collection<KeyFrame> frames = timeLine.getKeyFrames();
    Duration frameGap = Duration.millis(256);
    Duration frameTime = Duration.ZERO ;
    for (Image img : images) {
        frameTime = frameTime.add(frameGap);
        frames.add(new KeyFrame(frameTime, e -> imgView.setImage(img)));
    }
    timeLine.setCycleCount(Timeline.INDEFINITE);
    timeLine.play();
}