在Java编程语言中,创建一个启动画面,特别是视频启动画面,可以显著提升应用程序的用户体验。本文将介绍如何使用Java实现一个简单的视频启动画面,该画面可以播放GIF、AVI、MPG、3GPP、Real等格式的视频文件。
首先,需要创建一个名为Splash的类,该类继承自Canvas并实现了PlayerListener和Runnable接口。这个类将负责播放视频文件,并在视频播放结束后跳转到下一个屏幕。
package GALAXY.videosplash;
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
public class Splash extends Canvas implements PlayerListener, Runnable {
private Display display;
private Displayable next;
private String MIMEtype;
private Player player;
private String file;
public Splash(Display display, Displayable next, String file, String MIMEtype) {
this.display = display;
this.next = next;
this.file = file;
this.MIMEtype = MIMEtype;
Thread th = new Thread(this);
th.start();
}
protected void keyPressed(int keyCode) {
stopPlayer();
nextScreen();
}
protected void paint(Graphics g) {
int x = g.getClipX();
int y = g.getClipY();
int w = g.getClipWidth();
int h = g.getClipHeight();
g.setColor(0x0000000);
g.fillRect(x, y, w, h);
}
protected void pointerPressed(int x, int y) {
stopPlayer();
nextScreen();
}
protected void showNotify() {}
private void nextScreen() {
this.display.setCurrent(next);
}
public void run() {
try {
resetplayer();
} catch (MediaException ex) {
nextScreen();
}
this.play(file);
}
public void playerUpdate(Player player, String playerstate, Object object) {
if (playerstate == PlayerListener.END_OF_MEDIA) {
try {
resetplayer();
} catch (MediaException me) {
}
player = null;
nextScreen();
}
}
private void resetplayer() throws MediaException {
if (player != null) {
if (player.getState() == Player.STARTED) {
player.stop();
}
if (player.getState() == Player.PREFETCHED) {
player.deallocate();
}
if (player.getState() == Player.REALIZED ||
player.getState() == Player.UNREALIZED) {
player.close();
}
}
player = null;
}
private void play(String url) {
try {
InputStream is = getClass().getResourceAsStream(url);
VideoControl vc;
resetplayer();
player = Manager.createPlayer(is, this.MIMEtype);
player.prefetch();
player.addPlayerListener(this);
player.realize();
vc = (VideoControl) player.getControl("VideoControl");
if (vc != null) {
vc.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
vc.setDisplayLocation(((this.getWidth() - vc.getDisplayWidth()) / 2),
(this.getHeight() - vc.getDisplayHeight()) / 2);
vc.setVisible(true);
this.setFullScreenMode(true);
}
player.prefetch();
player.start();
this.display.setCurrent(this);
} catch (Throwable t) {
player = null;
nextScreen();
}
}
private void stopPlayer() {
try {
resetplayer();
} catch (MediaException me) {
}
player = null;
}
}
上述代码定义了一个Splash类,它初始化视频播放器,并在视频播放结束后跳转到下一个屏幕。
接下来,需要从MIDlet中启动Splash类。以下是SplashMIDlet类的示例代码,它创建并初始化Splash类的实例。
package GALAXY.videosplash;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class SplashMIDlet extends MIDlet {
static SplashMIDlet instance;
public SplashMIDlet() {
instance = this;
}
public void startApp() {
Display display = Display.getDisplay(this);
Splash sp = new Splash(display, new Form("Test"), "/PhotoStory.3gp", "video/3gpp");
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}