代号一:将时间轴设置为背景图
Codename One: Setting Timeline as background image
我想在启动画面中添加动画图像或视频。它应该适合不同设备的屏幕尺寸。起初我尝试添加一个 .mp4 ,它起作用了,但我无法正确设置 t运行sitions (在进入下一个表格之前显示黑色矩形)。所以我换了一个时间轴,将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 设备(平板电脑和 phone)上崩溃。
选项 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 尝试了每个中心行为(没有任何行为,只是放置它也被尝试过)。添加图像作为标签图标。
结果:图像没有缩放,而且它出现在屏幕的左侧,而不是中心。
不记得我是否遗漏了一个选项,无论如何,所有选项都适用于从 jpg 或 png 加载的静态图像,是时间轴的问题吗?
有什么办法可以真正制作动画启动画面吗? (我不反对使用视频,在那种情况下我需要让控件消失并且最后的 t运行sition 是瞬时的,尝试使用计时器和完成回调,都显示黑色矩形 t运行sitioning)
之前视频的大小
那里似乎有倒退。我们会在下次更新时修复它。
您不需要调用 requiresDrawImage()
,因为它是我们内部使用的回调。您选择的第一种方法应该可以正常工作。
我想在启动画面中添加动画图像或视频。它应该适合不同设备的屏幕尺寸。起初我尝试添加一个 .mp4 ,它起作用了,但我无法正确设置 t运行sitions (在进入下一个表格之前显示黑色矩形)。所以我换了一个时间轴,将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 设备(平板电脑和 phone)上崩溃。
选项 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 尝试了每个中心行为(没有任何行为,只是放置它也被尝试过)。添加图像作为标签图标。
结果:图像没有缩放,而且它出现在屏幕的左侧,而不是中心。
不记得我是否遗漏了一个选项,无论如何,所有选项都适用于从 jpg 或 png 加载的静态图像,是时间轴的问题吗?
有什么办法可以真正制作动画启动画面吗? (我不反对使用视频,在那种情况下我需要让控件消失并且最后的 t运行sition 是瞬时的,尝试使用计时器和完成回调,都显示黑色矩形 t运行sitioning)
之前视频的大小那里似乎有倒退。我们会在下次更新时修复它。
您不需要调用 requiresDrawImage()
,因为它是我们内部使用的回调。您选择的第一种方法应该可以正常工作。