Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代号一:将时间线设置为背景图像_Java_Image_Codenameone - Fatal编程技术网

Java 代号一:将时间线设置为背景图像

Java 代号一:将时间线设置为背景图像,java,image,codenameone,Java,Image,Codenameone,我想在启动屏幕上添加动画图像或视频。它应该适合不同设备的屏幕大小。起初,我试图添加一个.mp4,这很有效,但我无法正确地进行转换(在进入下一个表单之前显示黑色矩形)。所以我改成了一个时间线,将gif添加到.res文件中,并尝试绘制它。我尝试过的方法都没有效果,我已经没有选择了,所以我想我会问是否有更好的方法 选项1:设置背景 protected void beforeVideoSplash(Form f) { super.beforeVideoSplash(f); FormFac

我想在启动屏幕上添加动画图像或视频。它应该适合不同设备的屏幕大小。起初,我试图添加一个.mp4,这很有效,但我无法正确地进行转换(在进入下一个表单之前显示黑色矩形)。所以我改成了一个时间线,将gif添加到.res文件中,并尝试绘制它。我尝试过的方法都没有效果,我已经没有选择了,所以我想我会问是否有更好的方法

选项1:设置背景

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());
    }
然后将其添加到具有中心约束的BorderLayout的容器内的标签

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

选项4:设置中心行为

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

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

不记得我是否错过了一个选项,在任何情况下,所有选项都可以与从JPG或PNG加载的静态图像一起工作,这是问题所在吗


有没有办法制作一个动画闪屏?(我不反对使用视频,在这种情况下,我需要使控件消失,并在结束时立即进行转换,使用计时器和完成时回调进行尝试,两者都显示了一个黑色矩形,大小与转换前的视频相同)

那里似乎存在回归。我们将在下次更新时修复它


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

谢谢Shai,是的,那天晚些时候我意识到requiresDrawImage()只返回一个布尔值,当我把它放进去时,我的想法是“让我们尝试任何东西”。