游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1762|回复: 0

使用低级UI制作图解应用程序2wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2006-4-19 15:08:00 | 显示全部楼层 |阅读模式
调用上面的方法进行屏幕的更新。在repaint()中,画面整体都会被更新,而在repaint(int x,int y,int width,int height)中只有在指定范围内的画面才可能被更新。

制作应用程序

现在我们想利用低级API来制作应用程序。在上一讲中,我们讲述如何利用高级API来制作计算器的应用程序,在本讲中我们再讲述一下如何利用低级API来制作计算器的应用程序。

♦ 3-1 计算器应用程序的设计
本讲中所讲的计算器应用程序就是在按键上输入数字和运算符号。所以有必要获取按键事件。

如下是应用程序的类结构。

   • N800Calculator2 (MIDlet main class)
   • CalculatorCanvas (actual screen)



主题画面中无论按住哪一个键,都会转至计算器的画面。

♦ 3-2 介绍状态变量
在本讲的应用程序中有主题画面和计算器画面。主题画面中无论按哪一个键,都会转至计算器的画面。在计算器画面中,用按键输入数字和运算符号进行计算,在屏幕中显示出结果。由于要将主题画面和计算器画面的不同的功能都在同一画面中管理,所以在本讲中的应用程序,使用表示现在画面的状态的状态变量。

状态变量在CalculatorCanvas类中有以下定义。

     private final int STATE_TITLE = 0; //主题画面
     private final int STATE_MAIN = 1; //计算器画面
     private int state; //状态



Code Example 4
在状态变量state中用CalculatorCanvas类定义了STATE_TITLE,STATE_MAIN的2个常量。 由if语句判断应用程序的状态,如下所示:

     if(state == STATE_TITLE){// 主题画面
        记述处理
     }else if(state==STATE_MAIN){// 计算器画面
        记述处理
     }



Code Example 5
而且,即使是正在进行计算器画面表示时,其中仍会有状态。

计算器在开始的显示画面中显示为[0]。然后输入数字[3],屏幕中就会出现[3],再输入数字[4]屏幕上显示出[34]。再输入[5]后就成了[345]了。继续键入数字后,数字文字列就会突然终止,这些情况我们应该是知道的。但是,第一次按[+]后在输入数字[6],则在显示屏中并不显示成[3456],而只表示成[6]。

   • 持续输入数字,到一定程度就会出现键入终止,所以必须先清除这些数字,之后再键入新的数字。
   • 前者是数字的连续键入中,后者是运算符号的选择后,其他是所表示的数字是[0]的时候。


为能实现这样的处理,本讲中的应用程序就要使用名为clearFlag的boolean型变数。输入运算符号后直接将clearFlag变为true。输入数字时要检查clearFlag,true的话,清除表示中的数字表示所输入的数值。而false,则要终止表示数字的数字文字列。

//输入数字时的处理
if (keycode >= 48 && keycode <= 57) {
    if (clearFlag) {
        numString = "";
    if (keycode == 48) {
        clearFlag = true;
    } else {
        clearFlag = false;
        }
    }
    numString += getKeyName(keycode);
}



Code Example 6
♦ 3-3 制作各个画面
依次制作主题画面、计算器画面。

描绘处理是关键,在CalculatorCanvas的paint方法中进行处理。

♦ 3-3-1 描绘画面背景
用如下的pait方法去实现背景颜色的设置:

    // //设定背景
    g.setColor(237, 237, 211);
    g.fillRect(0, 0, getWidth(), getHeight());



Code Example 7
♦ 3-3-2 制作主题画面
在主画面上显示图片和提示信息&quotress any key",代码如下:(图8)

if(state == STATE_TITLE){

    //表示主题画面
    g.drawImage(titleImg, 0, 0, Graphics.LEFT | Graphics.TOP);

    //表示信息
    g.setColor(0, 0, 0);
    g.drawString("Press Any Key!!",30,140,Graphics.LEFT | Graphics.TOP);
}



Code Example 8
  
Figure 8


♦ 3-3-3 制作计算器画面
下面要讲的就是我们所需要的计算器画面了。能够显示出表示计算结果的显示屏和输入数字和运算符号的按键。

if(state==STATE_MAIN){//当是计算屏幕时

    //显示图片
    g.drawImage(keyImg, 0, 35, Graphics.LEFT | Graphics.TOP);

    // 显示数字
    g.setColor(0, 0, 0);
    g.drawRect(11, 10, 140, 20);
    g.setColor(255, 255, 255);
    g.fillRect(11, 10, 140, 20);

    // 写数字
    g.setColor(0, 0, 0);
    g.drawString(numString, 150, 30, Graphics.RIGHT | Graphics.BOTTOM);

    // 写操作
    g.drawString(operatorString,160,35,Graphics.RIGHT | Graphics.BOTTOM);
}




Code Example 9
在本讲中准备了表示按键 配置的画像,目的是让用户知道每个图片按钮的功能对应的相应按键。用DrawImage方式在空白处描绘出按键的画像。 另外,在数字的描绘、运算符号的描绘中使用变量(分别numString,operatorString)。按住按键时就会改变这些变量,也会反映在画面中。

  
Figure 9


♦ 3-4 实现事件处理
♦ 3-4-1 命令事件
为了要结束应用程序和初始化计算器的数值,要使用命令事件。

if (command == clear) { // 当清除命令时

    //初始化
    tmp = 0;
    numString = "0";
    operatorString = "";
    clearFlag = true;
    repaint();
}
if (command == exit) { // 当停止命令时

    // 停止执行
    try {
        ((N800Calculator2) midlet).destroyApp(true);
        } catch (Exception e) {
    }
    ((N800Calculator2) midlet).notifyDestroyed();
}



Code Example 10
按EXIT命令后就会结束应用程序。调用N800Calculator2类(应用程序的主类)的destroyApp方法去实现这个功能。

♦ 3-4-2 按键事件
在主题画面中按键事件发生后,无论按哪个键都会转到计算器画面。在计算器画面中,按数字键就可以更新画面上的数字,按方向键上的运算符号后可以进行计算,并且再一次更新画面。

public void keyPressed(int keycode) {

    // 根据状态去选择
    if (state == STATE_TITLE) {// 显示title

    // change the state
        state = STATE_MAIN;
    } else { // 主画面

        switch (getGameAction(keycode)) {
            case Canvas.DOWN : //除
                calculate();
                operator = 3;
                operatorString = "/";
                clearFlag = true;
                break;
            case Canvas.UP : // 乘
                calculate();
                operator = 2;
                operatorString = "*";
                clearFlag = true;
                break;
            case Canvas.LEFT : // 加
                calculate();
                operator = 0;
                operatorString = "+";
                clearFlag = true;
                break;
            case Canvas.RIGHT : // 减
                calculate();
                operator = 1;
                operatorString = "-";
                clearFlag = true;
                break;
            case Canvas.FIRE :
                calculate();
                operator = 4;
                operatorString = "";
                clearFlag = true;
                break;
                default :
                break;
        }
    }

//值得清除
if (keycode >= 48 && keycode <= 57) {
    if (clearFlag) {

        numString = "";//清空值
            if (keycode == 48) {
                clearFlag = true;
            } else {
                clearFlag = false;
            }
        }
    numString += getKeyName(keycode);
    }
    repaint();
}



Code Example 11
发生按键事件后会有画面显示的变化,因此要更新画面。在这些方法的最后调用repaint方法,进行画面的再描绘。

♦ 3-5 计算器的计算处理
用calculate方法处理计算逻辑。这个方法根据运算符号进行计算,运算结果的数字用numString字符串显示出来。

public void calculate() {
    try {
        int num = Integer.parseInt(numString); // Gets entered value

        // and performs calculation
        switch (operator) {
            case 0 : // 加法
                tmp = tmp + num;
                break;
            case 1 : // 减法
                tmp = tmp - num;
                break;
            case 2 : //乘法
                tmp = tmp * num;
                break;
            case 3 : // 除法
                tmp = tmp / num;
                break;
            default : // When "=" is selected
                tmp = num; //照原样输入所输入的数值
                break;
        }
    } catch (Exception e) {//发生异常时
        tmp = 0;
        e.printStackTrace();
    }
    numString = String.valueOf(tmp);
}



Code Example 12
♦ 3-6 完成
如下是完成后的源码。 (N800Calculator2.zip)

在此范例程序中,为要清楚结构,只实际实现了有限的功能。以此为基础,可以进行制作真正计算器程序的挑战。

♦ 3-7 执行计算器程序
下面我们来执行已经制作完成的程序。

   
1.主题画面  2.计算器画面
   
3.输入[234] 4.输入[+]
   
5.输入[356]后再输入[=],显示出结果 6.选择命令清除键,清除数值


♦ 总结
在本讲的讲述中我们了解到利用低级API能够开发应用程序。由于使用的是低级API,所以能够在画面上进行各种各样的描绘,因此,我们制作应用程序的范围又加大了。我们在第2讲、第3讲中一并介绍了创建用户接口API的问题。在下一讲中,我们将主要介绍利用时间类制作含有动画的应用程序。

向N800中传送应用程序
到本讲为止,制作完应用程序后在模拟器上进行执行确认。但是我们并没有在N800的实际机器上进行测试。因此,使用传送工具从PC向N800传送MIDlet应用程序。下面讲一下实际的操作方法。

顺序如下所示

1.编码
2.制作jar文件
3.制作jad文件
4.使用传送工具传送
5.   真机操作

1. 编译

使用「NEC N800/N810/e530 Application Emulator」将制作完成的JAVA程序进行编译。

2. 制作jar文件

下面我们来制作jar文件。在模拟器上进行操作确认也几乎没有什么变化。若不能顺利传送时,为了要在真机操作必须在参数「MIDlet-Description」的输入平台上的「MIDlet list」中重新记述「MIDlet-Description」。(图10)

  
Figure 10
3.制作jad文件  
以下介绍怎样制作jad文件。参数的设定没必要特意更改模拟器上的TEST时。(图11)
  
Figure 11
4. 现在我们讲述使用传送工具进行传送的内容。  
将N800和PC用数据线连接。随后就会出现「java Tool」。在「JAD file」平台上设定jad文件的路径,而在「JAR file」平台上设定jar文件。于是,调试PC与真机相连的部分,在「PortNum」平台上设定端口号。按「WriteFile」键,显示出传送完成则表示已经成功了。(图12)
未传送成功的情况下,请尝试修改端口号。  
  
Figure 12
5.真机操作
传送完成之后就要进行真机操作了。插入电源,在“百宝箱”菜单中用上次传送的应用程序名(MIDlet-Name)设定名字。在上述情况下,加上N800Calculator2)的话,就会传送成功。一旦jar文件和jad文件不同,就会出现下载失败的信息。特别是,记述jad文件时千万不要忘记设定「MIDlet-Description」。一旦必须输入参数不足,则会出现下载错误。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 07:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表