⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgcanvas.java

📁 J2me实现的MSN Messeger客户端程序。聊天、添加好友、删除好友、阻止好友
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -