|
Posted on 2005-11-16 18:19 讓變化成為計(jì)劃的一部分 閱讀(503) 評(píng)論(0) 編輯 收藏 所屬分類: J2ME
請(qǐng)參考java.util.TimerTask.
TimerTask is something like Timer in VisualBasic. You can sepcify a time period in milliseconds
for your requirement"一幅LOGO顯示完以后,幾秒種自動(dòng)顯示下一幅LOGO". Here is an sample code.
 public void testTimer() {
MyTimerTask myTimerTask = new MyTimerTask();
Timer timer = new Timer();
timer.schedule(myTimerTask, 5000, 10000); //wait for 5 seconds and then call the function every

10 seconds
}

 class MyTimerTask extends TimerTask {
 public void run() {
//This method will be called every 10 Seconds

Image im = Image.createImage(imageData, 0, imageData.length);
if(im == null)
System.out.println("NULL IMAGE");
System.out.println("The Size of the Byte Array is:" +imageData);
if(frm.size() > 0)
for(int i = 0; i < frm.size(); i++)
frm.delete(i);
frm.append(im);
disp.setCurrent(frm);

}
}


另外,對(duì)于你所說的是不是應(yīng)該叫做SplashScreen,那么國(guó)外曾經(jīng)有人給出這么一個(gè)例子,雖然不是周期性地顯示一張又一張的圖片,而是利用TimerTask周期性地repaint畫布,畫出一種Splash Screen的感覺,你可以參考:
import java.util.*;

import javax.microedition.lcdui.*;

public class WaitCanvas
 extends Canvas {
private int mCount, mMaximum;
private int mInterval;

private int mWidth, mHeight, mX, mY, mRadius;
private String mMessage;

 public WaitCanvas() {
mCount = 0;
mMaximum = 36;
mInterval = 100;

mWidth = getWidth();
mHeight = getHeight();

// Calculate the radius.
int halfWidth = (mWidth - mRadius) / 2;
int halfHeight = (mHeight - mRadius) / 2;
mRadius = Math.min(halfWidth, halfHeight);

// Calculate the location.
mX = halfWidth - mRadius / 2;
mY = halfHeight - mRadius / 2;

// Create a Timer to update the display.
 TimerTask task = new TimerTask() {
 public void run() {
mCount = (mCount + 1) % mMaximum;
repaint();
}
};
Timer timer = new Timer();
timer.schedule(task, 0, mInterval);
}

 public void setMessage(String s) {
mMessage = s;
repaint();
}

 public void paint(Graphics g) {
int theta = -(mCount * 180 / mMaximum);


// Clear the whole screen.
g.setColor(255, 255, 255);
g.fillRect(0, 0, mWidth, mHeight);

// Now draw the pinwheel.
g.setColor(0, 0, 0);

g.drawArc(mX, mY, mRadius, mRadius, 0, 360);

g.fillArc(mX, mY, mRadius, mRadius, theta + 20, 20);
//g.fillArc(mX, mY, mRadius, mRadius, theta + 60, 60);
//g.fillArc(mX, mY, mRadius, mRadius, theta + 90, 90);
//g.fillArc(mX, mY, mRadius, mRadius, theta + 120, 120);

// Draw the message, if there is a message.
if (mMessage != null)
g.drawString(mMessage, mWidth / 2, mHeight,
Graphics.BOTTOM | Graphics.HCENTER);
}
}


上面那個(gè)是利用TimerTask自動(dòng)定時(shí)填充圖形來展示Splash Screen的,那么下面這個(gè)就是顯示圖片來Splash Screen了:
import java.util.*;
import javax.microedition.lcdui.*;

 public class Splash extends Canvas {

private Display display;
private Displayable next;
private Timer timer=new Timer();

 public Splash (Display display,Displayable next) {
this.display=display;
this.next=next;
display.setCurrent(this);
}

 protected void showNotify () {
 timer.schedule( new TimerTask () { public void run() {
displayNext(); }},8000);
}

 protected void hideNotify() {
timer.cancel();
}

 protected void keyPressed (int keycode) {
displayNext();
}

 protected void pointerPressed (int x, int y) {
displayNext();
}

 private void displayNext() {
display.setCurrent(next);
}

 protected void paint (Graphics g) {
int height=this.getHeight();
int width=this.getWidth();

// fill background as white
g.setColor(0xFFFFFF);
g.fillRect(0,0,width,height);

Image logo=null;
 try {
logo=Image.createImage("/images/logo.png");
 } catch (Exception ignore) {}

g.drawImage(logo,width/2,height/2,g.HCENTER|g.VCENTER);
}

}

here's the calling method in your midlet(it passes the Display and current Displayable):

 /** *//**
* This shows the splash
*/

 private void showSplash () {
new Splash (display,MenuList);
}

 還有一種辦法是利用currentTimeMillis。 無非就是利用System.currentTimeMillis()+2000先行計(jì)算出什么時(shí)間該顯示 后一幅圖片了,如果靠while循環(huán)不斷檢測(cè)發(fā)現(xiàn)時(shí)間到了,就換那張圖片。
private boolean showImage;
 

void someMethod()
  {
long time = System.currentTimeMillis()+2000;

showImage = true;
while(System.currentTimeMillis()<time)
  {
repaint();
serviceRepaints();
}
showImage = false;
}

public void paint()
  {
 
if(showImage)
g.drawImage(img,offsetX,MAX_Y/2,g.LEFT|g.VCENTER);
}
efei說: “你要做的無非就是一個(gè)延時(shí),過一定時(shí)間就換一幅圖片。至于怎么來判斷這個(gè)延時(shí),方法多種多樣,用線程,用TimerTask,用System.currentTimeMillis(),基本上都一樣
個(gè)人比較傾向于使用線程作為固定的時(shí)鐘脈沖來驅(qū)動(dòng)游戲。
對(duì)于System.currentTimeMillis(),我只能告訴你兩點(diǎn),一是它的作用是取得當(dāng)前時(shí)間,二呢,用這個(gè)方法如果只是簡(jiǎn)單比較時(shí)間,那么如果中斷游戲,過一段時(shí)間再恢復(fù),就會(huì)存在問題。 ”
|