带有GIF的JavaFX Splash场景

时间:2017-04-24 21:41:21

标签: javafx java-8

最近我开发了一款个人软件来帮助我完成日程安排。我曾试图让荷马辛普森大吃一碟,作为一个很酷的启动闪屏,但遗憾的是GIF不会播放。

这是整个代码

public class Homer extends Application
{
    public static final String SPLASH_GIF =
            "https://media.giphy.com/media/JRQ1PegFVKXBu/giphy.gif";
    private static final int SPLASH_WIDTH = 400;
    private static final int SPLASH_HEIGHT = 224;
    private Pane splashLayout;


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

    @Override
    public void start(final Stage initStage) throws Exception {
        ImageView splash = new ImageView(new Image(
                SPLASH_GIF
        ));
        splashLayout = new Pane();
        splashLayout.getChildren().add(splash);

        Scene scene = new Scene(splashLayout, SPLASH_WIDTH, SPLASH_HEIGHT);
        scene.setFill(Color.TRANSPARENT);
        initStage.initStyle(StageStyle.TRANSPARENT);
        initStage.setWidth(SPLASH_WIDTH);
        initStage.setHeight(SPLASH_HEIGHT);
        initStage.setScene(scene);
        initStage.show();
        System.out.println("finished");
    }
}

将图片格式切换为PNG,如下所示

public static final String SPLASH_GIF =
        "http://www.dashboardwidgets.com/showcase/data/43/homerQuotes-1p2f.png";

这将只是一个简单的荷马图片,而不是吃香蕉。我希望有一个GIF。

怎么可能?

2 个答案:

答案 0 :(得分:2)

在尝试你的例子时,我可以把它放到

com.sun.javafx.iio.ImageStorageException: No loader for image data

如果我使用的是不同的网址,其中包含由http加载的动画gif,而不是http s http://www.picgifs.com/music-graphics/music-graphics/beatles/music-graphics-beatles-186070.gif),并且ImageView正在运行。

我还用香蕉下载了Homer并将其保存并加载

final ImageView imageView = new ImageView(new Image("file:JRQ1PegFVKXBu.gif"));

ImageView的工作原理正确。

我在JavaFX API中没有发现不支持https的提示,但是在启动启动画面中不做下载会更好,因为这可能需要很长时间。

答案 1 :(得分:2)

失败是因为源链接是html文件而不是gif文件

问题在于,某些Folk的问题中的链接实际上并不是图像(即使网址以.gif结尾),而是HTML页面或重定向到HTML页面(您可以看到这一点)通过在浏览器中加载链接)。

如果替换html链接:

使用实际的GIF链接:

然后GIF图像加载和显示按预期工作。

除了支持图像加载的协议

实际上问题与https无关。 JavaFX API确实通过https正确实现加载图像。根据Image javadoc:

  

URL支持的所有网址都可以传递给构造函数。如果传递的字符串不是有效的URL,而是路径,则在这种情况下在类路径上搜索Image。

底层JavaFX图像实现只是来自URL类的opens a stream(可以通过搜索JavaFX源代码来确定)。因此,底层JRE实现支持的任何协议都将与JavaFX图像类一起使用。其中包括http:https:file:jar:协议;并且可能包括其他人,具体取决于JRE的实施。如果您愿意,甚至可以添加custom protocol handlers