📄 msgcanvas.java
字号:
package vitular.ui;
import javax.microedition.lcdui.*; //MIDP1.0 适应
//MIDP1.0 适应
//
import javax.microedition.lcdui.game.*;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import java.io.InputStream;
/**
*扩展Canvas类
*@CopyRight:百维动力
*@Author:ceze && jj
*@Version 2.0 2004/6/13
* 在XCanvas的基础上添加了显示消息的方法
* 并改进了一些地方
*/
//Midp2.0适应
abstract public class MsgCanvas
extends GameCanvas
implements Runnable, CtrlListener {
/**
* 手机键值定义(Unija手机适用),KEY_UP--->KEN_END 数字键同SDK定义KEY_NUM0....
* 上方向
*/
public static final int KEY_UP = -1; //
/**
* 下方向
*/
public static final int KEY_DOWN = -2; //
/**
* 左方向
*/
public static final int KEY_LEFT = -3;
/**
* 右方向
*/
public static final int KEY_RIGHT = -4;
/**
* 选择键
*/
public static final int KEY_SELECT = -5;
/**
* 左功能键
*/
public static final int KEY_SOFT1 = -6;
/**
* 右功能键
*/
public static final int KEY_SOFT2 = -7; //
/**
* 清除键
*/
public static final int KEY_CLEAR = -8; //
/**
* 发送键
*/
public static final int KEY_SEND = -10; //
/**
* 挂机键
*/
public static final int KEY_END = -11; //
/**
*按键值所对应的位, 通过位关系运算,可以用于出来多按键
*/
public static final int KEY_UP_PRESSED = 1 << (KEY_UP + 18);
/**
*
*/
public static final int KEY_DOWN_PRESSED = 1 << (KEY_DOWN + 18);
/**
*
*/
public static final int KEY_LEFT_PRESSED = 1 << (KEY_LEFT + 18);
/**
*
*/
public static final int KEY_RIGHT_PRESSED = 1 << (KEY_RIGHT + 18);
/**
*
*/
public static final int KEY_SELECT_PRESSED = 1 << (KEY_SELECT + 18);
/**
*
*/
public static final int KEY_SOFT1_PRESSED = 1 << (KEY_SOFT1 + 18);
/**
*
*/
public static final int KEY_SOFT2_PRESSED = 1 << (KEY_SOFT2 + 18);
/**
*
*/
public static final int KEY_CLEAR_PRESSED = 1 << (KEY_CLEAR + 18);
/**
*
*/
public static final int KEY_SENT_PRESSED = 1 << (KEY_SEND + 18);
/**
*
*/
public static final int KEY_END_PRESSED = 1 << (KEY_END + 18);
/**
*
*/
public static final int KEY_NUM0_PRESSED = 1 << (KEY_NUM0 - 30);
/**
*
*/
public static final int KEY_NUM1_PRESSED = 1 << (KEY_NUM1 - 30);
/**
*
*/
public static final int KEY_NUM2_PRESSED = 1 << (KEY_NUM2 - 30);
/**
*
*/
public static final int KEY_NUM3_PRESSED = 1 << (KEY_NUM3 - 30);
/**
*
*/
public static final int KEY_NUM4_PRESSED = 1 << (KEY_NUM4 - 30);
/**
*
*/
public static final int KEY_NUM5_PRESSED = 1 << (KEY_NUM5 - 30);
/**
*
*/
public static final int KEY_NUM6_PRESSED = 1 << (KEY_NUM6 - 30);
/**
*
*/
public static final int KEY_NUM7_PRESSED = 1 << (KEY_NUM7 - 30);
/**
*
*/
public static final int KEY_NUM8_PRESSED = 1 << (KEY_NUM8 - 30);
/**
*
*/
public static final int KEY_NUM9_PRESSED = 1 << (KEY_NUM9 - 30);
/**
*
*/
public static final int KEY_STAR_PRESSED = 1 << 30;
/**
*
*/
public static final int KEY_POUND_PRESSED = 1 << 31;
/**
* 屏幕下角按键类型定义 : 无按键
*/
public static final int BUTTON_TYPE_NONE = -1;
/**
* 确定按键
*/
public static final int BUTTON_TYPE_OK = 0x0;
/**
* 取消 按钮
*/
public static final int BUTTON_TYPE_CANCEL = 0x1;
/**
* 运行按钮
*/
public static final int BUTTON_TYPE_RUN = 0x2;
/**
* 暂停按钮
*/
public static final int BUTTON_TYPE_PAUSE = 0x3;
/**
* 弹出按钮
*/
public static final int BUTTON_TYPE_OPEN = 0x04;
/**
* button图位置
*/
private final String BUTTON_IMAGE_NAME = "/img/button.png";
private final int BUTTON_IMAGE_FRAME = 5;
/**
*
*/
public static final int STATUS_BASE = 0X1000;
/**
* 闪屏状态
*/
public static final int STATUS_SPLASH = STATUS_BASE + 1; //闪屏状态
/**
* 菜单状态
*/
public static final int STATUS_MENU = STATUS_BASE + 2; //菜单
/**
* 文本板状态
*/
public static final int STATUS_TEXTBOARD = STATUS_BASE + 3; //文本显示 可以用于调用文本显示板 showText
/**
* 游戏状态
*/
public static final int STATUS_GAME = STATUS_BASE + 4; //
// public static final int STATUS_HELP = STATUS_BASE + 5; //
// public static final int STATUS_ABOUT = STATUS_BASE + 6;
// public static final int STATUS_HIGHTSCORE = STATUS_BASE + 7;
/**
* 暂停状态
*/
public static final int STATUS_PAUSE = STATUS_BASE + 8;
/**
* 游戏结束状态
*/
public static final int STATUS_GAMEOVER = STATUS_BASE + 9;
/**
* 动画状态
*/
public static final int STATUS_FLASH = STATUS_BASE +10;
/**
* FORM状态
*/
public static final int STATUS_FORM = STATUS_BASE + 11;
/**
* 程序状态定义,如需其它状态定义,请从STATUS_USER递增
*/
public static final int STATUS_USER = STATUS_BASE + 20; //开发者自定义状态
//屏幕更新时间(MS)
private final int INTERVAL_TIME = 200;
/**
* 菜单上一项或者下一项时发出的声音
*/
public static final byte SOUND_MENU = 1;
/**
* 消息进入时发出的声音
*/
public static final byte SOUND_MSG_IN = 2;
/**
* 屏幕宽高
*/
public static int ScreenWidth, ScreenHeight;
/**
* 程序状态
*/
protected int appStatus;
protected Graphics ownG;//真正的Canvas的Graphics对象,需调用flushGraphics()才能显示
protected Image screenImg;//给用户绘画的Image,
/**
* screenImg 的Graphics对象
* 一切图形文字可以往此上画.相当paint(g)中的g
* 需调用flushGraphics()才能显示
*/
protected Graphics screenG;
private Image img_msg;//消息图标
private int msgHeight;//消息的高度
private String msg = null;//要绘制的消息
private boolean bShowMsg = false;//是否显示消息
private boolean bShowMsgOnTop = true;//是否在顶部显示消息,如果为false则在底部显示
private Command leftCmd, rightCmd;//左边显示的命令和右边显示的命令
// private Player menuPlayer;
// private Player msgPlayer;
private boolean bSoundOn;
/**
* 提供给外部用于画图的Graphics
*/
//protected Graphics paintG;
/**
* 按键状态
*/
protected int keyStatus;
private Thread thread = null;
private int interval; //线程间隔时间
private boolean initDataFinish; //数据加载是否完成
private boolean stopthread = true;
private boolean pausethread = true;
private Splash splash; //闪屏对象实例
private Splash flash = null; //动画对象实例
private TextBoard textBoard = null; //文本显示板
private Image buttonImg; //屏幕下角按钮图片
private int buttonTypeLeft, buttonTypeRight; //按钮类型
private String appVerStr; //程序版本
private String splashStr; //闪屏图片路径+名称
private Image splashImg; //闪屏图对象
private boolean bFlash = false;//如果是播放动画的状态是可以播放动画
/**
* 构造函数 屏幕设为全屏模式
* @param supportKeyEvent boolean 是否支持按键持续事件
* @param splashName String 程序闪屏背景图片
* @param appVersion String 程序版本信息
* @param splashMusicName String 闪屏背景音效
*/
public MsgCanvas(String splashName, String appVersion,
String splashMusicName) {
super(false);
//初始化屏幕相关内容
ScreenWidth = super.getWidth();//真实的屏幕宽度
ScreenHeight = super.getHeight();//真实的屏幕高度
keyStatus = 0;
interval = INTERVAL_TIME; //默认线程间隔时间
splashStr = splashName;
appVerStr = appVersion;
initDataFinish = false;
bSoundOn = true;
//loadSound();
//初始化消息相关内容
try{
img_msg = Image.createImage("/img/msg.png");
}catch(Exception e){}
//取得画图对象
ownG = this.getGraphics();
ownG.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
msgHeight = ownG.getFont().getHeight();
screenImg = Image.createImage(ScreenWidth, ScreenHeight - msgHeight);//创建一块与屏幕同等大小的画布
screenG = screenImg.getGraphics();
screenG.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
//创建显示闪屏
splash = new Splash(this, splashName, splashMusicName, "正在进入,请稍候",appVersion);
splash.setListener(this);
splash.startSplash(); //闪屏开始
System.out.println("Start splash");
//启动闪屏线程
appStatus = STATUS_SPLASH;
//启动主程序线程
start();
System.gc();
}
/**
* 构造函数 屏幕设为全屏模式
* @param supportKeyEvent boolean 是否支持按键持续事件
* @param splashName String 程序闪屏背景图片
* @param appVersion String 程序版本信息
*/
public MsgCanvas(String splashName, String appVersion) {
this(splashName, appVersion, null);
}
/**
*
*/
private synchronized void initData() throws Exception {
buttonTypeLeft = buttonTypeRight = BUTTON_TYPE_NONE;
initProgramData();
splashImg = Image.createImage(splashStr);
buttonImg = Image.createImage(BUTTON_IMAGE_NAME);
//this.setCommandListener(this);
}
public void setCommand(String leftStr, String rightStr){
if (leftCmd != null)
this.removeCommand(leftCmd);
if (rightCmd != null)
this.removeCommand(rightCmd);
if (leftStr!=null){
leftCmd = new Command(leftStr, Command.ITEM, 1);
}else{
leftCmd = new Command("", Command.ITEM, 1);
}
if (rightStr!=null){
rightCmd = new Command(rightStr, Command.ITEM, 1);
}else{
rightCmd = new Command("", Command.ITEM, 1);
}
this.addCommand(leftCmd);
this.addCommand(rightCmd);
}
/**
* 取得画图用的graph
*/
public Graphics getPaintG(){
if (bShowMsg){
//System.out.println("Get the screenG!");
return screenG;
}else{
//System.out.println("Get the ownG");
return ownG;
}
//return ownG;
}
/**
*
*/
private void threadRun() {
try {
switch (appStatus) {
case STATUS_SPLASH:
try {
if (initDataFinish == false && splash != null ) {
initData();
System.out.println("Finish initData");
splash.stopSplash();
initDataFinish = true;
}else if(!bFlash && flash != null){//如果检测到为闪屏结束状态,则停止闪屏
//flash.pause();
}
}
catch (Exception e) {
e.printStackTrace();
}
break;
case STATUS_TEXTBOARD:
if (textBoard != null) {
// System.out.println("textBoard ask for g");
textBoard.update(this.getPaintG());
flushGraphicsWithButton();
}
break;
default:
update();
}
}
catch (Exception e) {
}
}
/**
*XCanvas默认的线程方式,通过start方法可以启动它
*/
public void run() {
if (interval == 0) {
threadRun();
}
else {
while (!stopthread) {
while (!pausethread) {
try {
if (stopthread) {
return;
}
threadRun();
thread.sleep(interval);
}
catch (InterruptedException e) {
e.printStackTrace();
}
} //~end stopthread
} //~end killthread
} //~end else
stop();
} //~end run()
/**
*XCanvas的线程启动,Interval为线程跳动的间隙时间,即每过Interval时间XCavans就会自动调用update方法
*/
public void start(int Interval) {
interval = Interval;
start();
}
/**
*XCanvas的线程启动,以默认时间间隔调用启动update方法
*/
public void start() {
pausethread = false;
stopthread = false;
thread = new Thread(this);
thread.start();
}
/**
*销毁闪屏
*/
public void destroySplash() {
splash = null;
System.gc();
}
/**
*线程暂停
*/
public void pause() {
pausethread = true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -