我以前曾經用Alert做過環境界面,可以使用display.setCurrent(alert,next)方法。這樣當alert的顯示時間結束或者用戶按鍵的話會顯示出下個界面。這基本上可以滿足我們的需求,但是這樣的效果並不太理想,我在手機上多次測試都不好。在這裡我介紹一種使用Canvas制作歡迎界面的方法,在其中會涉及到一些關於Timer和TimerTask的內容,你可以參考我在J2SE中的相關文章看如何使用這兩個簡單且重要的class。
我們的目的是顯示一個歡迎界面給用戶,當用戶按下任意鍵或者設置的顯示時間到時的話顯示出下個主界面。我們創建一個WelcomeCanvas類來繼承Canvas類在paint(Graphics g)裡面提供方法來繪制我們歡迎界面的圖片。例如:
protected void paint(Graphics arg0)
{
int width = this.getWidth();
int height = this.getHeight();
Image displayImage = null;
try
{
displayImage = Image.createImage("/Duke.png");
} catch (IOException e)
{
e.printStackTrace();
}
arg0.drawImage(displayImage, width / 2, height / 2, Graphics.HCENTER
| Graphics.BOTTOM);
}
在WelcomeCanvas中我們希望當它被顯示的時候開始計時。這樣我們可以覆蓋方法showNotify(),如下所示:
protected void showNotify()
{
timer.schedule(new TimerTask()
{
public void run()
{
dismiss();
}
}, displayTime);
}
這樣當顯示canvas的時候,系統已經開始計時了,displayTime後會顯示主界面。也許用戶等不了這麼長時間,那麼當他按鍵的時候也應該顯示出主界面,因此我們覆蓋方法keyPressed()和pointerPressed()如下所示:
protected void keyPressed(int keyCode)
{
dismiss();
}
protected void pointerPressed(int y, int x)
{
dismiss();
}
private void dismiss()
{
timer.cancel();
display.setCurrent(nextUI);
}
這樣我們的WelcomeCanvas基本構造起來了,我們寫一個測試的MIDlet來看看效果,MIDlet和WelcomeCanvas的代碼內容如下:
備注:這個程序是在eclipse環境下運行的,因此你應該把Duke.png文件復制到res目錄下,否則會拋出異常。這個圖片我是在wtk的安裝目錄隨便找的。
import Javax.microedition.lcdui.Command;
import Javax.microedition.lcdui.CommandListener;
import Javax.microedition.lcdui.Display;
import Javax.microedition.lcdui.Displayable;
import Javax.microedition.lcdui.Form;
import Javax.microedition.midlet.MIDlet;
import Javax.microedition.midlet.MIDletStateChangeException;
public class MyMIDlet extends MIDlet
{
private Display display;
private Form mainForm = new Form("main form");
protected void startApp() throws MIDletStateChangeException
{
display = Display.getDisplay(this);
mainForm.append("this is the main form");
WelcomeCanvas welcome = new WelcomeCanvas(display, mainForm);
welcome.setDisplayTime(6000);
display.setCurrent(welcome);
}
protected void pauseApp()
{
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
}
}
import Java.io.IOException;
import Java.util.Timer;
import Java.util.TimerTask;
import Javax.microedition.lcdui.Canvas;
import Javax.microedition.lcdui.Display;
import Javax.microedition.lcdui.Displayable;
import Javax.microedition.lcdui.Graphics;
import Javax.microedition.lcdui.Image;
public class WelcomeCanvas extends Canvas
{
private Display display;
private Displayable nextUI;
private Timer timer = new Timer();
private long displayTime = 3000;
public WelcomeCanvas(Display dis, Displayable disp) {
this.display = dis;
this.nextUI = disp;
}
protected void paint(Graphics arg0)
{
int width = this.getWidth();
int height = this.getHeight();
Image displayImage = null;
try
{
displayImage = Image.createImage("/Duke.png");
} catch (IOException e)
{
e.printStackTrace();
}
arg0.drawImage(displayImage, width / 2, height / 2, Graphics.HCENTER
| Graphics.BOTTOM);
}
public void setDisplayTime(long dispTime)
{
this.displayTime = dispTime;
}
protected void keyPressed(int keyCode)
{
dismiss();
}
protected void pointerPressed(int y, int x)
{
dismiss();
}
private void dismiss()
{
timer.cancel();
display.setCurrent(nextUI);
}
protected void showNotify()
{
timer.schedule(new TimerTask()
{
public void run()
{
dismiss();
}
}, displayTime);
}
}