WEB开发网
开发学院软件开发Java Canvas和Media实现钢琴效果 阅读

Canvas和Media实现钢琴效果

 2007-12-23 12:37:41 来源:WEB开发网   
核心提示:本例使用Canvas绘制钢琴的界面,同时使用了MIDP 2.0的media子系统来播放钢琴按键触发的声音效果,Canvas和Media实现钢琴效果,是个不错的图形用户界面和音效结合的范例,下载源码/* * PianoMIDlet.java * * Created on 2005年12月6日, 下午2:02 */pack

Canvas和Media实现钢琴效果本例使用Canvas绘制钢琴的界面,同时使用了MIDP 2.0的media子系统来播放钢琴按键触发的声音效果。是个不错的图形用户界面和音效结合的范例。

下载源码

/*
 * PianoMIDlet.java
 *
 * Created on 2005年12月6日, 下午2:02
 */

package com.j2medev.piano;

import javax.microedition.media.*;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class PianoMIDlet extends MIDlet {
   public void startApp() {
     Displayable d = new PianoCanvas();
     d.addCommand(new Command("Exit", Command.EXIT, 0));
     d.setCommandListener(new CommandListener() {
       public void commandAction(Command c, Displayable s) {
         notifyDestroyed();
       }
     });
     Display.getDisplay(this).setCurrent(d);
   }
   public void pauseApp() {}
  
   public void destroyApp(boolean unconditional) {}
}

class PianoCanvas extends Canvas {
   PRivate static final int[] kNoteX = {
     0, 11, 16, 29, 32, 48, 59, 64, 76, 80, 93, 96
   };
   private static final int[] kNoteWidth = {
     16,  8, 16,  8, 16, 16,  8, 16,  8, 16,  8, 16
   };
   private static final int[] kNoteHeight = {
     96, 64, 96, 64, 96, 96, 64, 96, 64, 96, 64, 96
   };
   private static final boolean[] kBlack = {
     false, true, false, true, false,
         false, true, false, true, false, true, false
   };
   private int mMiddleCX, mMiddleCY;
   private int mCurrentNote;
   public PianoCanvas() {
     int w = getWidth();
     int h = getHeight();
     int fullWidth = kNoteWidth[0] * 8;
     mMiddleCX = (w - fullWidth) / 2;
     mMiddleCY = (h - kNoteHeight[0]) / 2;
     mCurrentNote = 60;
   }
   public void paint(Graphics g) {
     int w = getWidth();
     int h = getHeight();
     g.setColor(0xffffff);
     g.fillRect(0, 0, w, h);
     g.setColor(0x000000);
     for (int i = 60; i <= 72; i++)
       drawNote(g, i);
     drawSelection(g, mCurrentNote);
   }
   private void drawNote(Graphics g, int note) {
     int n = note % 12;
     int octaveOffset = ((note - n) / 12 - 5) * 7 * kNoteWidth[0];
     int x = mMiddleCX + octaveOffset + kNoteX[n];
     int y = mMiddleCY;
     int w = kNoteWidth[n];
     int h = kNoteHeight[n];
     if (isBlack(n))
       g.fillRect(x, y, w, h);
     else
       g.drawRect(x, y, w, h);
   }
   private void drawSelection(Graphics g, int note) {
     int n = note % 12;
     int octaveOffset = ((note - n) / 12 - 5) * 7 * kNoteWidth[0];
     int x = mMiddleCX + octaveOffset + kNoteX[n];
     int y = mMiddleCY;
     int w = kNoteWidth[n];
     int h = kNoteHeight[n];
     int sw = 6;
     int sx = x + (w - sw) / 2;
     int sy = y + h - 8;
     g.setColor(0xffffff);
     g.fillRect(sx, sy, sw, sw);
     g.setColor(0x000000);
     g.drawRect(sx, sy, sw, sw);
     g.drawLine(sx, sy, sx + sw, sy + sw);
     g.drawLine(sx, sy + sw, sx + sw, sy);
   }
   private boolean isBlack(int note) {
     return kBlack[note];
   }
   public void keyPressed(int keyCode) {
     int action = getGameAction(keyCode);
     switch (action) {
       case LEFT:
         mCurrentNote--;
         if (mCurrentNote < 60)
           mCurrentNote = 60;
         repaint();
         break;
       case RIGHT:
         mCurrentNote++;
         if (mCurrentNote > 72)
           mCurrentNote = 72;
         repaint();
         break;
       case FIRE:
         try {
           Manager.playTone(mCurrentNote, 1000, 100);
         } catch (MediaException me) {
         }
         break;
       default:
         break;
     }
   }
}


(出处:http://www.cncms.com)


Tags:Canvas Media 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接