我们知道有些手机是不支持重复按键功能,为了模拟重复按键的功能,我们不得不使用一个线程来进行处理。
废话少说,直接贴代码吧。
package com.srk.local.key.demo1;
import javax.microedition.lcdui.Canvas;
public class NewEvent implements Runnable {
KeyEventCanvas kec;
protected boolean swtichPonit;
protected byte[] keyCode;
byte index;
public NewEvent(KeyEventCanvas kec) {
this.kec = kec;
keyCode = new byte[2];
}
public synchronized void startAction(int keyCode) {
this.keyCode[index] = (byte) keyCode;
index = (byte) ((index + 1) % this.keyCode.length);
}
public synchronized void stopAction(int keyCode) {
for (int i = 0; i <= this.keyCode.length - 1; i++) {
if (this.keyCode[i] == (byte) keyCode) {
this.keyCode[i] = 0;
break;
}
}
}
public synchronized boolean getSwtichPoint() {
this.swtichPonit = false;
for (int i = 0; i <= this.keyCode.length - 1; i++) {
if (this.keyCode[i] != 0) {
this.swtichPonit = true;
break;
}
}
return this.swtichPonit;
}
public synchronized byte[] getKeyCode() {
return this.keyCode;
}
public void run() {
byte[] temp = this.getKeyCode();
while (true) {
while (this.getSwtichPoint()) {
for (int i = 0; i <= temp.length - 1; i++) {
if (temp[i] != 0) {
switch (kec.getGameAction(temp[i])) {
case Canvas.UP:
kec.py--;
break;
case Canvas.DOWN:
kec.py++;
break;
case Canvas.LEFT:
kec.px--;
break;
case Canvas.RIGHT:
kec.px++;
break;
default:
break;
}
}
}
kec.repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
package com.srk.local.key.demo1;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
public class KeyEventCanvas extends Canvas implements CommandListener {
public int px, py;
private NewEvent ne;
private Command exitCommand;
public KeyEventCanvas() {
ne = new NewEvent(this);
exitCommand = new Command("退出", Command.EXIT, 1);
this.addCommand(exitCommand);
this.setCommandListener(this);
new Thread(ne).start();
}
public void keyPressed(int keyCode) {
ne.startAction(keyCode);
}
public void keyReleased(int keyCode) {
ne.startAction(keyCode);
}
protected void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(0xff0000);
g.fillRect(px, py, 8, 8);
}
public void commandAction(Command command, Displayable displayable) {
if (command == exitCommand) {
KeyMainMIDlet.quitApp();
}
}
}
package com.srk.local.key.demo1;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Display;
public class KeyMainMIDlet extends MIDlet implements CommandListener {
private Command exitCommand;
private KeyEventCanvas currentDisplay;
private static KeyMainMIDlet kmildlet;
public KeyMainMIDlet() {
kmildlet = this;
exitCommand = new Command("退出", Command.EXIT, 1);
currentDisplay = new KeyEventCanvas();
}
protected void startApp() throws MIDletStateChangeException {
Display.getDisplay(kmildlet).setCurrent(currentDisplay);
}
protected void pauseApp() {
}
protected void destroyApp(boolean _boolean) throws
MIDletStateChangeException {
}
public static void quitApp() {
try {
kmildlet.destroyApp(false);
kmildlet.notifyDestroyed();
} catch (MIDletStateChangeException e) {
e.printStackTrace();
}
}
public void commandAction(Command command, Displayable displayable) {
if (command == exitCommand) {
kmildlet.quitApp();
}
}
}