|
Posted on 2005-11-16 18:19 让变化成为计划的一部分 阅读(488) 评论(0) 编辑 收藏 所属分类: J2ME
请参考java.util.TimerTask.
TimerTask is something like Timer in VisualBasic. You can sepcify a time period in milliseconds
for your requirement"一幅LOGO显示完以后,几秒种自动显示下一幅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);
} }
另外,对于你所说的是不是应该叫做SplashScreen,那么国外曾经有人给出这么一个例子,虽然不是周期性地显示一张又一张的图片,而是利用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); } }
上面那个是利用TimerTask自动定时填充图形来展示Splash Screen的,那么下面这个就是显示图片来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先行计算出什么时间该显示 后一幅图片了,如果靠while循环不断检测发现时间到了,就换那张图片。
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说: “你要做的无非就是一个延时,过一定时间就换一幅图片。至于怎么来判断这个延时,方法多种多样,用线程,用TimerTask,用System.currentTimeMillis(),基本上都一样
个人比较倾向于使用线程作为固定的时钟脉冲来驱动游戏。
对于System.currentTimeMillis(),我只能告诉你两点,一是它的作用是取得当前时间,二呢,用这个方法如果只是简单比较时间,那么如果中断游戏,过一段时间再恢复,就会存在问题。 ”
|