游戏开发论坛

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

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

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2006-4-19 15:07:00 | 显示全部楼层 |阅读模式
作者:未知 文章来源:nec♦ 介绍
        在上一讲中讲述了如何利用高级API制作简单的应用程序。在这讲中,我们将讲述如何利用低级API进行图解应用程序的开发。

♦ 低级API
     在上一讲中所叙述的高级API具有很高的移植性,由于不能仅限于使用被定义的部分,因此,制作成具有很大的制约限制的UI是相当困难的。但是,在本讲中将要学习的低级API,由于不同机种的显示屏的尺寸和按键的数量也不一样,所以即使移植性降低,也能完全按照自己的意图制作UI,还可以直接访问输入装置。

    Canvas类和Graphics类实现了低级API。Canvas类是Displayable类的子类、用于图形和事件操作。一个canvas组件表示一个可绘画的屏幕区域,一个Grafics类为描绘Canvas组件提供图片,文本和形状。

♦ 3-1 Canvas类
     Canvas类是Displayable的子类,提供描绘和处理低级事件的方法。另外,Canvas类是抽象类,因此必须在应用中创建继承Canvas类的单独的类。

     Canvas类中有一个名为paint(Graphics g)的抽象方法。用paint方法中去实现需要的图片,文本以及图形。所以我们要跳过这个方式来讲解。

Code Example 1
运用Canvas类,在paint(Graphics)方法中,可以进行图片和文本的制作。

Class MyCanvas extends Canvas{
   void paint(Graphics g){
        .
        .
        .
   }
}



♦ 3-1-1 获取手机终端的画面尺寸
     与PC画面相比,手机终端的画面尺寸较小,有必要在其中创建用户接口,所以设置是非常重要的。为此,使用Canvas描绘画像、TEXT、图形时有必要知道画面的具体尺寸。根据手机终端不同,能够在画面上描绘的范围大小也各不相同,在Canvas类中有获取画面尺寸的方法:

     • int getWidth()

     • int getWidth()

不用预先知道具体硬件画面的尺寸,使用getWidth(),getHeight()灵活地获取,具有较高重用性。

♦ 3-2 Graphics类
     Graphics类具有2D的绘画功能、与J2SE的java.awt.Graphics非常的相似。定义了描绘TEXT、画像、图形等等各种各样的方法。

♦ 3-2-1 图形的描绘
♦ 3-2-1-1 线的描绘
(x1,y1)是线的起点;(x2,y2)是线的终点。

能够用void drawLine(int x1,int y1,int x2, int y2); 描绘线。

♦ 3-2-1-2 四边形的描绘
使用以下的方式进行四边形的描绘。此时的(x,y)被指定为想要描绘的四边形左上方顶点的坐标。

    • void drawRect(int x,int y,int width,int height)

    • void drawRect(int x,int y,int width,int height)

用drawRect方法描绘四边形。用fillRect描绘中间全被涂抹的四边形。另外,Graphics图形的描绘方式中有draw的方法和fill的方法。draw只是单指图形的描画。而fill~则是指中间被涂抹的图形的描画。

此外,利用下面的方法,能够描绘出圆角的四角形。

   • void drawRoundRect(int x,int y,int width,int height.int arcWidth,int arcHeight)

   • void fill RoundRect(int x,int y,int width,int height.int arcWidth,int arcHeight)

图1所示,是方法中参数的定义和描述。图2中是示例。

  
Figure 1
  
Figure 2


♦ 3-2-1-3 圆的描绘
利用以下方式进行圆的描绘。

    • void drawArc(int x,int y,int width,int height,int startAngle,int arcAngle)

    • void fillArc(int x,int y,int width,int height,int startAngle,int arcAngle)

此时,坐标(x,y)是高为height、宽为width的长方形左上方角的顶点坐标。若是height和width的值相等则可以描绘出圆的弧线。startAngle,arcAngle分别设定各自的角度(单位:°)。图3所示的是各自的变量;图4所示的是表示例。

  
Figure 3
  
Figure 4


♦ 3-2-1-4 色彩的描绘
     运用Graphics类指定颜色给描绘的图形和文本。如果先定义好颜色,那就能按照预先的设定颜色显示。用如下方法进行颜色设定。

    • void setColor(int RGB)
    • void setColor(int red, int green , int blue)
    • void setGrayScale(int value)


用16进制指定色彩的情况下,则要在RGB中指定16进制的数值。此时要显示16进制的状况就要在数头附加「0x」。用10进制指定的情况下,分别用3个不同的[0-255]的数值指定red,green,blue。使用标尺的情况下,在10进制[0-255]的范围中指定色彩的浓淡。

若要更改北景的色彩时,首先在setColor方式中指定色彩,随后在fillRect方式中描绘填充的四边形。

    //背景呈黑色
    g.setColor(0x000000);
    g.fillRect(0,0,getWidth(),getHeight());



根据以下的方法能够获取现在已经设定的色彩值。

    • int getColor()
    • int getBlueComponent()
    • int getGreenComponent()
    • int getRedComponent()
    • int getGrayScale()


getColor方法下能够获取设定完成的RGB16进制数值。getBlueComponent,getGreenComponent,getRedComponent下的青、蓝、红的数值能够获取在10进制的[0-255]的范围内的数值。

♦ 3-2-1-5 线型
     Graphics类中准备了描绘线时的2个式样:DOTTED和SOLID。draw方法下,线型的指定是有效的。fill方法中线型的设定是无效的。 利用以下方法进行设定。

    • void setStrokeStyle(int style)


线型的样式中有DOTTED(点线)和SOLID(实线),若要指定DOTTED时, Graphics类的参数就是Graphics.DOTTED,指定SOLID时,Graphics类的参数就是Graphics.SOLID。(图5)

  
Figure 5


♦ 3-2-2 Text的描绘
使用以下方法描绘Canvas上的文本

    • void drawChar(char character,int x,int y,int anchor)
    • void drawChar(char[] data,int offset,int length,int x,int y,int anchor)
    • void drawString(String string,int x,int y,int anchor)
    • void drawSubString(String str,int offset,int length,int x,int y,int anchor)


♦ 3-2-2-1 TEXT字体的设定
     在应用中描绘TEXT时,并不只是默认的文字,应该也有必要描绘粗体字和下划线文字吧?MIDP的API中有表示字体的Font类。和Graphics的对象一样,可以定义一个Font的对象去更改文本的字体。按照以下的方法获取Font对象:

    • static Font getFont(int face,int style,int size)


Font中有face,style,size3个属性。以下图表中表示的是能够指定的值。

属性   Face  Style  Size
能够指定的值  FACE_MONOSPACE FACE_PROPORTIONAL  STYLE_BOLD STYLE_ITALIC
  SIZE_LARGESIZE_MEDIUM SIZE_SMALL
   FACE_SYSTEM  STYLE_PLAIN STYLE_UNDERLINED  SIZE_SMALL

运用逻辑操作符号“|“可以同时使用多个属性。
为使获取的Font能在Graphics中设定,则要使用
    • void setFont(Font font)

请看下面的范例。
Font font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_ITALIC|Font.STYLE_BOLD,
        Font.SIZE_LARGE);
g.setFont(font);



Code Example 2
另外,请按照如下方式获取字体的各种信息:

    • int charsWidth(char[] ch,int offset,int length)
    • int charWidth(char ch)
    • int getBaselinePosition()
    • int getHeight()
    • int stringWidth(String str)
    • int substringWidth(String str,int offset,int len)


♦ 3-2-2-2 定位点
     像Text和画像那样在Canvas上配置子类时位置决定是必要的情况下,指定被称为定位点的基点,将定位点作为描绘的基准进行描绘。

在定位点中有如下的内容。

Horizontal   Vertical
LEFT

HCENTER

RIGHT
  TOP

BASELINE

VCENTER

BOTTOM



定义定位点时,使用使用逻辑运算符[|],有必要分别指定横方向和纵方向。其中能够在画像描绘的定位点上指定垂直方向,但是应该注意,在Text描绘的定位点上不能够指定垂直方向。

drawString("String",x,y,width,height, Graphics.LEFT | Graphics.TOP);



Code Example 3
如上所示指定的定位点的坐标和文字关系显示状况如下图所示。

  
Figure 6


另外,按照如下所示的方法指定定位点时就会出现图7。

drawString("String",x,y,width,height,Graphics. HCENTER | Graphics.BOTTOM);

  
Figure 7


♦ 3-2-3 图像的描绘
用Graphics类中的方法描绘画像。

    • void drawImage(Image img, int x, int y, int anchor)


定位点的指定与Text的描绘一样。

♦ 3-3 事件和事件的处理
     Canvas类实现了低级用户接口API、主要处理用户输入的按键事件。高级API要求实现listener接口中的事件手柄。用低级API,所有的低级事件都可以传送给Canvas类,因此,应用程序就必须重载一些事件处理的方法。以下是Canvas类的事件处理方法。

    • showNotify()
    • hideNotify()
    • keyPressed()
    • keyRepeated()
    • keyReleased()
    • paint()


这些方法被MIDP的线程按顺序调用。当一个事件处理的方法正在被执行时,其它的事件是不能被执行的。因此,这些方法中必须返回当前状态值。

♦ 3-3-1 Show事件和Hide事件
     在画面显示Canvas之前,Canvas表示的就是Show事件。而且,Canvas在系统画面中被消除后,Hide事件就会产生。这些事件可调用以下的方法:

    • void showNotify()
    • void hideNotify()


这些方式,防止描绘卡通时的画面闪烁的对缓冲工作时,利用off screen缓冲(表示前在里面进行描绘的缓冲)可以解决画面闪烁问题。详细情况将在动画的讲解中详细说明。

♦ 3-3-2 按键事件
     当用户按下键盘的键时,Canvas接受按键事件。每一个按键都有键代码。每一个键值和相应数值的ASII值相等。以下是每个按键和其编码。

按键  按键代码   按键代码的数值
0  KEY_NUM0  48
1  KEY_NUM1  49
2  KEY_NUM2  50
3  KEY_NUM3  51
4  KEY_NUM4  52
5  KEY_NUM5  53
6  KEY_NUM6  54
7  KEY_NUM7  55
8  KEY_NUM8  56
9  KEY_NUM9  57
*  KEY_STAR  42
#  KEY_POUND  35


另外,要从按键代码中获取按键名应使用以下Canvas的getKeyName()方法。

以下3种方式可以处理按键事件。

    • void keyPressed(int keyCode)
    • void keyReleased(int keyCode)
    • void keyRepeated(int keyCode)


keyPressed方法是按键时的处理; keyReleased方法是释放键时的处理。KeyRepeated方法记述了短时间内同一键被按多次时的处理。

♦ 3-3-2-1 游戏的响应
     一些应用程序,比如游戏,可能需要方向键的事件。Canva类中定义了一般游戏的响应。一个游戏响应可能关系到多个按键。以下所示的是N800的机型中游戏响应的常量和按键的对应值关系。

游戏动作  按键代码   按键代码的数值
UP    -1
DOWN    -2
LEFT    -3
RIGHT    -4
FIRE    -5
GAME_A  KEY_NUM7  55
GAME_B  KEY_NUM9  57
GAME_C  KEY_STAR  42
GAME_D  KEY_POUND  35


由于游戏动作的按键代码的Mapping因机种而异,所以要想制作成能在N800以外的机种上也能正常工作的MIDP应用程序,就必须要提高移植性。为此,利用getGameAction()方式,将按键代码变换成游戏动作来使用。

♦ 3-4 重绘的显示
     Screen的情况下,画面上的任意更改都会立刻自动反映到画面中。Canvas的情况下,即使在Canvas上加上更改到再描绘处理中也不会改变画面。以下是这个画面在描绘的方式。

    • void repaint()
    • void repaint(int x,int y,int width,int height)


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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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