zoukankan      html  css  js  c++  java
  • [JavaME]利用java.util.TimerTask来做Splash Screen的N种方法

    请参考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, 
    500010000); //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(255255255);
    g.fillRect(
    00, mWidth, mHeight);

    // Now draw the pinwheel.
    g.setColor(000);

    g.drawArc(mX, mY, mRadius, mRadius, 
    0360);

    g.fillArc(mX, mY, mRadius, mRadius, theta 
    + 2020);
    //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(),我只能告诉你两点,一是它的作用是取得当前时间,二呢,用这个方法如果只是简单比较时间,那么如果中断游戏,过一段时间再恢复,就会存在问题。

  • 相关阅读:
    设计模式之装饰器模式
    设计模式之原型模式
    设计模式之策略模式
    设计模式之适配器模式
    设计模式之注册模式
    wordpress中add_action和add_filter
    工厂模式
    设计模式之命令链模式
    观察者模式
    工厂模式
  • 原文地址:https://www.cnblogs.com/zhengyun_ustc/p/TimerTask.html
Copyright © 2011-2022 走看看