我想在我的项目中使用动画GIF,但我不知道如何停止循环动画。我的意思是,我希望GIF只能播放1次。
谢谢!
我没有做过GIF动画,甚至不知道JavaFX会有启动和停止它们的方法。如果你想使用图像做任何动画,我宁愿建议你自己一帧一帧地做。这样你就可以完全控制它,你的图像中可以有超过256种颜色。
我在Mike的博客中阅读了一篇关于使用JavaFX创建精灵动画的非常好的文章。
这很容易做到。您只需扩展 Transition 类,向其添加一个 ImageView,然后实现 Transition 的插值方法。
编辑:哦,顺便说一句,GIF有一个循环标志,告诉它们要么循环播放,要么不循环播放。换句话说:理论上你可以修改GIF文件的循环属性。仅在理论上,因为我刚刚尝试指定只播放一次,在JavaFX中它仍然以无休止的循环播放,而在FireFox中它只播放一次。顺便说一句,JavaFX似乎不支持支持超过256种颜色的动画PNG(APNG)。所以自动图像动画功能非常有限。最好自己做动画。
我希望有人能想出更好的方法,但这里有一个示例代码,说明如何完全控制gif。
import java.awt.image.BufferedImage;
import java.net.URISyntaxException;
import javafx.animation.Interpolator;
import javafx.animation.Transition;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
* Requires GifDecoder from here: http://www.java2s.com/Code/Java/2D-Graphics-GUI/DecodesaGIFfileintooneormoreframes.htm
*/
public class AnimatedGifDemo extends Application {
@Override
public void start(Stage primaryStage) throws URISyntaxException {
HBox root = new HBox();
// TODO: provide gif file, ie exchange banana.gif with your file
Animation ani = new AnimatedGif(getClass().getResource("banana.gif").toExternalForm(), 1000);
ani.setCycleCount(10);
ani.play();
Button btPause = new Button( "Pause");
btPause.setOnAction( e -> ani.pause());
Button btResume = new Button( "Resume");
btResume.setOnAction( e -> ani.play());
root.getChildren().addAll( ani.getView(), btPause, btResume);
Scene scene = new Scene(root, 1600, 900);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
public class AnimatedGif extends Animation {
public AnimatedGif( String filename, double durationMs) {
GifDecoder d = new GifDecoder();
d.read( filename);
Image[] sequence = new Image[ d.getFrameCount()];
for( int i=0; i < d.getFrameCount(); i++) {
WritableImage wimg = null;
BufferedImage bimg = d.getFrame(i);
sequence[i] = SwingFXUtils.toFXImage( bimg, wimg);
}
super.init( sequence, durationMs);
}
}
public class Animation extends Transition {
private ImageView imageView;
private int count;
private int lastIndex;
private Image[] sequence;
private Animation() {
}
public Animation( Image[] sequence, double durationMs) {
init( sequence, durationMs);
}
private void init( Image[] sequence, double durationMs) {
this.imageView = new ImageView(sequence[0]);
this.sequence = sequence;
this.count = sequence.length;
setCycleCount(1);
setCycleDuration(Duration.millis(durationMs));
setInterpolator(Interpolator.LINEAR);
}
protected void interpolate(double k) {
final int index = Math.min((int) Math.floor(k * count), count - 1);
if (index != lastIndex) {
imageView.setImage(sequence[index]);
lastIndex = index;
}
}
public ImageView getView() {
return imageView;
}
}
}
它提供了一个用于测试的暂停/恢复按钮。此外,您还需要Gif解码器代码和动画香蕉.gif。
有没有你可以开始和停止一个动画,所以播放1秒,停止1秒?我尝试过用单选按钮与Thread.Sleep切换来实现这一点,但是我认为这种方式是不可能的。有没有其他方法可以做到这一点?多谢了。
当我开始在uitextfield中输入时,我希望发生一些动画,在我完成输入之前,它不应该反转回来。我正在使用此代码设置动画: 我想做的是:当我开始在第一个文本字段中键入时,我希望第二个文本字段从视图中隐藏,当我完成键入时,我希望它重新设置动画。 我的问题是:当我开始键入动画时,它会返回到原始位置。它不会等我完成打字。
主要内容:实例,jQuery stop() 方法,实例jQuery stop() 方法用于在动画或效果完成前对它们进行停止。 停止滑动 时间是宝贵的,因此,我们为您提供快捷易懂的学习内容。 在这里,您可以通过一种易懂的便利的模式获得您需要的任何知识。 实例 jQuery stop() 滑动 演示 jQuery stop() 方法。 jQuery stop() 动画(带参数) 演示 jQuery stop() 方法 jQuery stop() 方法 j
代码非常简单,我搜索了一下,发现我只会用到 这似乎不起作用,我也尝试过使用平台参数,比如 下面是您可以运行的测试应用程序: 锁定得可拥有同步器:-无 更新:我正在Linux Fedora 16 64bit上使用最新的Oracle JDK 7u17 64bit。
问题内容: 有人可以教我如何使用a 来达到以下目的: 当我单击鼠标时,我需要一个开始动画的多边形(例如旋转等简单动画);当我再次单击时停止动画。 我对理解工作方式没有任何问题,但对于实际的动画来说,没有任何问题。我尝试在方法中用while块模拟动画,在该方法中我将绘制,擦除和重绘多边形(例如,模拟旋转),但是在while内,applet不会监听点击。它只会在片刻之后收听。单击鼠标时,我需要摆动计时
Triathlon程序执行一个长时间运行的任务,如果该任务已完全执行,则有可能重新启动该任务。我想添加停止执行以重置UI的可能性。为了达到这个目的,我增加了一个新的按钮,停止。代码如下: 如果任务已经完成,程序很好地重新启动,但是如果我在停止它之后调用start,程序就会崩溃。我该纠正什么?