使用Canvas编写的秒表程序

上一篇文章介绍了一个简单的秒表程序,是使用J2ME提供的StringItem开发的,简单,但是不够美观,下面贴一个使用Canvas编写的秒表程序,就当做一个进阶的例子吧。

Java代码 复制代码
  1. package midp.wallimn.com;   
  2.   
  3. import java.util.Date;   
  4. import java.util.Timer;   
  5. import java.util.TimerTask;   
  6.   
  7. import javax.microedition.lcdui.Canvas;   
  8. import javax.microedition.lcdui.Command;   
  9. import javax.microedition.lcdui.CommandListener;   
  10. import javax.microedition.lcdui.Display;   
  11. import javax.microedition.lcdui.Displayable;   
  12. import javax.microedition.lcdui.Graphics;   
  13. import javax.microedition.lcdui.Image;   
  14. import javax.microedition.lcdui.game.Sprite;   
  15. import javax.microedition.midlet.MIDlet;   
  16. import javax.microedition.midlet.MIDletStateChangeException;   
  17.   
  18. /** *//**  
  19.  * 秒表程序的高级版本,使用Canvas,外观稍好。 <br/>  
  20.  *   
  21.  * @version : V1.0<br/>  
  22.  * @author : (Email: wallimn@sohu.com QQ: 54871876)<br/>  
  23.  * @date : 2008-1-14 下午01:37:28<br/>  
  24.  */  
  25. public class StopWatchMIDlet extends MIDlet implements CommandListener ...{   
  26.   
  27.  private MyCanvas mainForm;   
  28.   
  29.  private Timer m_timer;// 定时器   
  30.   
  31.  private Display display;   
  32.   
  33.  private Command EXIT_CMD = new Command("退出", Command.EXIT, 1);   
  34.   
  35.  private Command STOP_CMD = new Command("停止", Command.STOP, 1);   
  36.   
  37.  private Command START_CMD = new Command("开始", Command.STOP, 1);   
  38.   
  39.  private MyTimerTask timerTask;   
  40.   
  41.  class MyTimerTask extends TimerTask ...{   
  42.   public int s = 0;// 秒   
  43.   
  44.   public int m = 0;// 分   
  45.   
  46.   public int h = 0;// 时   
  47.   
  48.   public int ms = 0;// 1/100秒   
  49.   
  50.   public MyTimerTask() ...{   
  51.   }   
  52.   
  53.   public void init() ...{   
  54.    s = 0;   
  55.    m = 0;   
  56.    h = 0;   
  57.    ms = 0;   
  58.   }   
  59.   
  60.   public void run() ...{   
  61.    if (ms == 9) ...{   
  62.     ms = 0;   
  63.     if (s == 59) ...{   
  64.      s = 0;   
  65.      if (m == 59) ...{   
  66.       m = 0;   
  67.       h++;   
  68.      } else ...{   
  69.       m++;   
  70.      }   
  71.     } else ...{   
  72.      s++;   
  73.     }   
  74.    } else ...{   
  75.     ms++;   
  76.    }   
  77.    mainForm.repaint();   
  78.   }   
  79.   
  80.  }   
  81.   
  82.  public StopWatchMIDlet() ...{   
  83.   display = Display.getDisplay(this);   
  84.   mainForm = new MyCanvas();   
  85.   mainForm.addCommand(EXIT_CMD);// 添加命令显示   
  86.   mainForm.addCommand(START_CMD);// 添加命令显示   
  87.   mainForm.setCommandListener(this);// 添加事件监听   
  88.  }   
  89.   
  90.  protected void destroyApp(boolean arg0) ...{   
  91.  }   
  92.   
  93.  protected void pauseApp() ...{   
  94.   
  95.  }   
  96.   
  97.  protected void startApp() throws MIDletStateChangeException ...{   
  98.   display.setCurrent(mainForm);   
  99.  }   
  100.   
  101.  public void commandAction(Command c, Displayable s) ...{   
  102.   if (c == EXIT_CMD) ...{   
  103.    if (m_timer != null) ...{// 停止计时器,释放资源   
  104.     m_timer.cancel();   
  105.     m_timer = null;   
  106.    }   
  107.    destroyApp(false);   
  108.    notifyDestroyed();   
  109.   } else if (c == STOP_CMD) ...{   
  110.    this.m_timer.cancel();   
  111.    m_timer = null;   
  112.    mainForm.removeCommand(STOP_CMD);   
  113.    mainForm.addCommand(START_CMD);   
  114.   } else if (c == START_CMD) ...{   
  115.    // 初始化一个计时器,初始化一个任务   
  116.    m_timer = new Timer();   
  117.    timerTask = null;// 先释放旧的任务   
  118.    timerTask = new MyTimerTask();   
  119.    timerTask.init();   
  120.    m_timer.schedule(timerTask, new Date(), 100);   
  121.    mainForm.removeCommand(START_CMD);   
  122.    mainForm.addCommand(STOP_CMD);   
  123.   }   
  124.  }   
  125.   
  126.  /** *//**  
  127.   * 日历显示输出 <br/>  
  128.   *   
  129.   * @version : V1.0<br/>  
  130.   * @author : 王力猛(Email: wallimn@sohu.com QQ: 54871876)<br/>  
  131.   * @date : 2008-1-22 下午04:19:51<br/>  
  132.   */  
  133.  class MyCanvas extends Canvas ...{   
  134.   
  135.   int m_width, m_height;   
  136.   
  137.   private Image numberImage = null;   
  138.   
  139.   /** *//**  
  140.    * 数字的宽度  
  141.    */  
  142.   private final int numWidth = 11;   
  143.   
  144.   /** *//**  
  145.    * 数字的高度  
  146.    */  
  147.   private final int numHeight = 15;   
  148.   /** *//**  
  149.    * 冒号的宽度  
  150.    */  
  151.   private final int colonWidth = 7;   
  152.   
  153.   private int xPos, yPos;   
  154.   
  155.   /** *//**  
  156.    * 数字的Y坐标  
  157.    */  
  158.   private int numStyle = 15;   
  159.   
  160.   public MyCanvas() ...{   
  161.    try ...{   
  162.     numberImage = Image.createImage("/images/misc.png");   
  163.    } catch (Exception e) ...{   
  164.     return;   
  165.    }   
  166.    // 计算数字显示位置,以便使数字居中显示   
  167.    xPos = (this.getWidth() - numWidth * 9) / 2;   
  168.    yPos = (this.getHeight() - numHeight) / 2;   
  169.   }   
  170.   
  171.   protected void paint(Graphics g) ...{   
  172.    g.setColor(0xFFFFFF);   
  173.    g.fillRect(00this.getWidth(), this.getHeight());   
  174.   
  175.    drawMyFlag(g);   
  176.       
  177.    int h = 0, m = 0, s = 0, ms = 0;   
  178.    if (timerTask != null) ...{   
  179.     h = timerTask.h;   
  180.     m = timerTask.m;   
  181.     s = timerTask.s;   
  182.     ms = timerTask.ms;   
  183.    }   
  184.   
  185.    int x = xPos;   
  186.    drawNumber(g, x, yPos, h / 10, numStyle);   
  187.    x += numWidth;   
  188.    drawNumber(g, x, yPos, h % 10, numStyle);   
  189.    x += numWidth;   
  190.    drawNumber(g, x, yPos, 10, numStyle);   
  191.   
  192.    x += colonWidth;   
  193.    drawNumber(g, x, yPos, m / 10, numStyle);   
  194.    x += numWidth;   
  195.    drawNumber(g, x, yPos, m % 10, numStyle);   
  196.    x += numWidth;   
  197.    drawNumber(g, x, yPos, 10, numStyle);   
  198.   
  199.    x += colonWidth;   
  200.    drawNumber(g, x, yPos, s / 10, numStyle);   
  201.    x += numWidth;   
  202.    drawNumber(g, x, yPos, s % 10, numStyle);   
  203.    x += numWidth;   
  204.    drawNumber(g, x, yPos, 10, numStyle);   
  205.   
  206.    x += colonWidth;   
  207.    drawNumber(g, x, yPos, ms, numStyle);   
  208.   
  209.   }   
  210.   
  211.   /** *//**  
  212.    * 输出图形格式的数字,这种方式利于数字的多样化 <br/> 编码:王力猛 时间:2008-1-22 下午04:22:55<br/>  
  213.    */  
  214.   private void drawNumber(Graphics g, int x, int y, int num, int ypos) ...{   
  215.    int wid = numWidth;   
  216.    if(num==10)wid =colonWidth;   
  217.    g.drawRegion(numberImage, num * numWidth, ypos, wid,   
  218.      numHeight, Sprite.TRANS_NONE, x, y, Graphics.HCENTER   
  219.        | Graphics.VCENTER);   
  220.   }   
  221.   
  222.   private void drawMyFlag(Graphics g)...{   
  223.    g.drawRegion(numberImage, 03211822,  Sprite.TRANS_NONE, 00, Graphics.TOP   
  224.      | Graphics.LEFT);   
  225.   }   
  226.   protected void showNotify() ...{   
  227.   }   
  228.   
  229.   protected void hideNotify() ...{   
  230.   }   
  231.   
  232.   /** *//**  
  233.    * 按钮处理 功能描述: 编码时间:2008-1-22 下午04:23:14 参数及返回值:  
  234.    *   
  235.    * @param kc  
  236.    * @see javax.microedition.lcdui.Canvas#keyPressed(int)  
  237.    */  
  238.   protected void keyPressed(int kc) ...{   
  239.    int ga = this.getGameAction(kc);   
  240.    if (ga == Canvas.FIRE || kc == Canvas.KEY_NUM5) ...{   
  241.     if (numStyle == 0) ...{   
  242.      numStyle = numHeight;   
  243.     } else if (numStyle == numHeight) ...{   
  244.      numStyle = 0;   
  245.     }   
  246.     repaint();   
  247.    }   
  248.   }   
  249.   
  250.   protected void keyReleased(int arg0) ...{   
  251.    // 时间: 2008-1-22 上午10:40:00   
  252.   }   
  253.  }   
  254.   
  255. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值