mingjava的专栏

The world need more people who are crazy

原创 使用Canvas制作MIDlet的欢迎界面收藏

新一篇: 如何学好J2ME | 旧一篇: 使用javadoc规范java开发文档

      通常,我们发布的应用软件在程序启动的时候都会显示一个欢迎界面,也可能是一些关于软件的说明信息,这篇文章将讲述如何自己制作一个这样的欢迎界面。

      我以前曾经用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;
/*
 * Created on 2004-7-28
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author E2412C
 *
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
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;

/**
 * @author E2412C
 *
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
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);
    }

}

 

发表于 @ 2004年07月28日 16:34:00|评论(loading...)|编辑

新一篇: 如何学好J2ME | 旧一篇: 使用javadoc规范java开发文档

评论

#clapton 发表于2004-07-29 08:55:00  IP: 211.99.250.*
gooda
#1 发表于2004-07-30 09:56:00  IP: 218.24.21.*
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
/**author
*
* @author Administrator
version * @version
*/
public class DONG extends MIDlet implements CommandListener{
Display display;
MyCanvas myCanvas;
Command exit;
public DONG(){
display=Display.getDisplay(this);
myCanvas=new MyCanvas();
exit=new Command("退出",Command.EXIT,1);
}

public void startApp() {
myCanvas.start();
display.setCurrent(myCanvas);

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
class MyCanvas extends Canvas {
Sprite sprite;
Image offscreen;
Image[] spriteImage=new Image[3];

public MyCanvas(){
if(!isDoubleBuffered()){
offscreen=Image.createImage(getWidth(),getHeight());
}
try{
for(int i=1;i<4;i++){
spriteImage[1]=Image.createImage("/"+i+".png");
}
}
catch(Exception ex){}
sprite=new Sprite(this,spriteImage);
}
public void paint(Graphics g){
Graphics old=g;
if(offscreen!=null){
#dfrank 发表于2004-07-31 15:20:00  IP: 211.144.83.*
好文章啊,虽然我已经解决了类似的问题,但最开始对Timer理解不深,造成了很大的麻烦
#1 发表于2004-07-30 09:59:00  IP: 218.24.21.*
编译没有错,但是画面出来一段时间就消逝了,不知道是什么问题。
#dx.dxlstudio 发表于2004-08-01 00:42:00  IP: 202.84.17.*
写得不错.
但一个welcome界面有没有必要那么麻烦? 会不会占有内存呢?
其实Alert做welcome界面不错啊,
可以具体说说"这样的效果并不太理想,我在手机上多次测试都不好"吗?
个人觉得j2me程序的基本原则就要简单明了,界面呢就不要太华丽了
(也不是说用Canvas做的是华丽-.-)
#mingjava 发表于2004-08-01 13:00:00  IP: 211.94.174.*
用canvas比alert的效果好很多,在手机上每个alert的实现差别比较大,我以前用alert的,但是发现效果不好,所以现在用canvas。放心不会耗费多少资源
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © mingjava