Codename One:将时间轴设置为背景图像

时间:2016-03-04 14:49:53

标签: java image codenameone

我想在我的启动画面中添加动画图像或视频。它应该适合不同设备的屏幕尺寸。起初我试图添加一个.mp4,但是我无法正确转换(在转到下一个表单之前显示黑色矩形)。所以我改为时间轴,将gif添加到.res文件并尝试绘制它。没有什么我尝试过的,我的选项用完了所以我想我会问是否有更好的方法。

选项1:设置BG

protected void beforeVideoSplash(Form f) {
    super.beforeVideoSplash(f);
    FormFactory.modifyBaseForm(f);

    Timeline splashGif = null;

    try {
        splashGif = (Timeline) Resources.openLayered("/theme").getImage("vNewSplash480x360.gif");
    } catch (IOException e) {
    }

    f.getAllStyles().setBgImage(splashGif);

}

结果:模拟器显示白屏。在Android设备(平板电脑和手机)上崩溃。

选项2:在玻璃窗格上绘画

protected void beforeVideoSplash(Form f) {
    super.beforeVideoSplash(f);
    FormFactory.modifyBaseForm(f);

    f.setGlassPane( new Painter() {

        public void paint(Graphics g, Rectangle rect) {
            Timeline splashGif = null;

            try {
                splashGif = (Timeline) Resources.openLayered("/theme").getImage("vNewSplash480x360.gif");
            } catch (IOException e) {
            }

            splashGif.requiresDrawImage();

            Display display = Display.getInstance();

            int imgWidth = display.getDisplayWidth();
            int imageHeight = 320 * display.getDisplayWidth() / 480;

            g.drawImage(splashGif, 0, (display.getDisplayHeight() - imageHeight) / 2, imgWidth, imageHeight); 
        }
    }
    );

}

结果:模拟器和Android设备上的白色屏幕。

选项3:缩放

不要重复自己,我像这样缩放图像:

    Image scaled;

    Display display = Display.getInstance();

    if (display.getDisplayWidth() > display.getDisplayHeight()) {
        scaled = splashGif.scaledWidth(display.getDisplayHeight());
    } else {
        scaled = splashGif.scaledWidth(display.getDisplayWidth());
    }

然后使用带有CENTER约束的BorderLayout将其添加到Container内的Label。

结果:这种方式实际上有效,但应用程序运行得太慢,可能是由于生成的图像的缩放和大小。

选项4:设置中心行为

使用BorderLayout尝试了每个中心行为(并且没有行为,只是尝试放置它)。添加了图像作为标签图标。

结果:图像没有缩放,加上它出现在屏幕的左侧,而不是在中心。

不记得我是否错过了一个选项,无论如何,所有选项都可以正常使用从jpgs或pngs加载的静态图片,时间轴是问题吗?

实际制作动画启动画面有什么意义吗? (我并不反对使用视频,在这种情况下,我需要让控件消失,最后的转换是瞬时的,尝试使用计时器和完成后的回调,两者都显示了视频大小的黑色矩形在过渡之前)

1 个答案:

答案 0 :(得分:0)

那里似乎有回归。我们将为下次更新修复它。

您无需致电requiresDrawImage(),因为它是我们内部使用的回调。你选择的第一种方法应该可以正常工作。