5g游戏开发用户界面开发.docx
《5g游戏开发用户界面开发.docx》由会员分享,可在线阅读,更多相关《5g游戏开发用户界面开发.docx(52页珍藏版)》请在冰豆网上搜索。
5g游戏开发用户界面开发
用户界面开发
本章目标
Ø掌握Display的基本使用方法
Ø熟悉Display的常用函数
Ø掌握如何使用命令按钮及处理命令按钮的事件
Ø熟悉文本框的使用
Ø掌握如何为屏幕添加滚动条
Ø掌握列表窗口的实现
Ø掌握列表的维护及列表选项的选中判断
1.1JaveME用户界面
JavaME应用程序的高级用户界面一般都是由Display对象和Displayable对象组成,其中,Display类可以用于管理系统的输入的输入设备和显示设备。
Displayable对象是一个可以被设置在Display上的对象。
1.2Display类
该类位于javax.microedition.lcdui.Display。
每个MIDlet只能有Display对象,应用程序可以通过调用静态成员函数getDisplay获得对Display对象的引用。
在MIDlet的运行过程中,无论何时调用getDisplay函数,都会返回相同的Display对象的引用。
getDisplay函数的语法定义如下:
publicstaticDisplaygetDisplay(MIDletm);
参数m用于制定返回哪个MIDlet对象的Display对象引用,如果参数为null,则触发空指针异常NullPointerException。
Display可以对当前显示屏幕的管理:
1、返回当前屏幕的Displayable对象方法为:
publicDisplayablegetCurrent();
2、使Displayable在前台运行方法为:
publicvoidsetCurrent(DisplayablenextDisplayable)
nextDisplayable参数是要被显示的Displayable对象,如果其值为null,那么,不会对当前显示产生任何影响,即当前显示不变。
因此,应该设置一个非空的Displayable对象,向手机中的应用程序管理器发送一个应用程序要求在前台运行的请求。
应用程序没有默认的Displayable对象,因此在应用程序初始化时,用户要通过setCurrent函数设置应用程序第一个被显示的界面。
Display可以获得边框类型和最佳图像大小。
1、通过Display的getBorderStyle函数返回系统采用的边框类型,语法定义:
publicintgetBorderStyle(Booleanhighlighted)
参数为true,则表示返回高亮状态的边框类型。
返回值为边框类型,可能有下面两个值之一:
Graphics.DOTTED:
虚线类型
Graphics.SOLID:
实线类型
2、通过Display的getBestImageWidth(intimagetype)、getBestImageHeight(intimagetype)获得图像的最佳宽度和高度
publicintgetBestImageWidth(intimageType)
publicintgetBestImageHeight(intimageType)
参数imageType是要返回最佳图像大小的组件类型,可以选择的参数值有以下几种:
1、LIST_ELEMENT:
image类型为List的选项图像
2、CHOICE_GROUP_ELEMENT:
Image类型为ChoiceGroup的选项图像
3、ALERT:
Image类型Alert的图像
可以获得系统颜色属性。
numColors():
获得当前设备支持的最大颜色数;
isColor():
是否支持彩色显示;
Alpha级别numAlphaLevels():
显示当前设备能支持的;
getColor(Display.COLOR_BACKGROUND):
显示背景颜色;
getColor(Display.COLOR_FOREGROUND):
显示前景颜色;
getColor(Display.COLOR_BORDER):
显示边框颜色;
getColor(Display.COLOR_HIGHLIGHTED_BACKGROUND):
高亮的背景颜色;
getColor(Display.COLOR_HIGHLIGHTED_FOREGROUND):
高亮的前景颜色;
getColor(Display.COLOR_HIGHLIGHTED_BORDER):
高亮的边框颜色;
程序4~1
说明:
本程序演示如何获得系统颜色属性
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
publicclassDisplayColorextendsMIDlet{
privateDisplaydisplay;
publicDisplayColor(){
super();
}
protectedvoidstartApp()throwsMIDletStateChangeException{
//获得当前MIDlet的Display对象
display=Display.getDisplay(this);
//numColor()获取当前设备支持的最大颜色数
System.out.println("MaxColors:
"+display.numColors());
//显示是否支持彩色显示
System.out.println("ColorPhone:
"+display.isColor());
//显示当前设备能支持的Alpha级别
System.out.println("AlphaLevel:
"+display.numAlphaLevels());
//显示颜色常量的RGB值
//背景颜色
intc=display.getColor(Display.COLOR_BACKGROUND);
Stringcolor=Integer.toHexString(c).toUpperCase();
System.out.println("Background:
"+color);
//前景颜色
c=display.getColor(Display.COLOR_FOREGROUND);
color=Integer.toHexString(c).toUpperCase();
System.out.println("foreground:
"+color);
//边框颜色
c=display.getColor(Display.COLOR_BORDER);
color=Integer.toHexString(c).toUpperCase();
System.out.println("Border:
"+color);
//高亮的背景颜色
c=display.getColor(Display.COLOR_HIGHLIGHTED_BACKGROUND);
color=Integer.toHexString(c).toUpperCase();
System.out.println("HighlightedBackground:
"+color);
//高亮的前景颜色
c=display.getColor(Display.COLOR_HIGHLIGHTED_FOREGROUND);
color=Integer.toHexString(c).toUpperCase();
System.out.println("HighlightedForeground:
"+color);
//高亮的边框颜色
c=display.getColor(Display.COLOR_HIGHLIGHTED_BORDER);
color=Integer.toHexString(c).toUpperCase();
System.out.println("HighlightedBorder:
"+color);
}
protectedvoidpauseApp(){
//TODOAuto-generatedmethodstub
}
protectedvoiddestroyApp(booleanarg0)
throwsMIDletStateChangeException{
//TODOAuto-generatedmethodstub
}
}
运行界面:
MaxColors:
4096
ColorPhone:
true
AlphaLevel:
256
Background:
FFFFFF
foreground:
0
Border:
AFAFAF
HighlightedBackground:
0
HighlightedForeground:
FFFFFF
HighlightedBorder:
606060
注意:
1、numColor():
该函数的返回值与isColor函数的返回值相关。
当isColor函数返回的值为true时,numColors函数的返回值表示当前显示设备所支持的最大彩色数;当isColor函数返回flase时,numColor函数返回值表示当前显示设备所支持的最大灰度等级。
对于黑白手机,其返回值为2。
2、numAlphaLevels:
该函数返回显示设备支持的透明等级。
返回2,那么设置支持全透明或不透明。
如果返回值大于2,则表示为透明的等级,有可能半透明。
3、publicintgetColor(intcolorSpecifier):
该参数colorSpecifier是颜色系统颜色常量的表示,返回值以0x00RRGGBB的格式表示系统颜色的RGB值。
在MIDP2。
0规范中,有以下几个颜色常量的表示可以使用。
COLOR_BACKGROUND:
常量值为0,表示屏幕上没有高亮显示的背景颜色
COLOR_BORDER:
常量值为4,表示屏幕上没有高亮显示的边框颜色,通常和背景颜色一起使用
COLOR_FOREGROUND:
常量值为1,表示屏幕上没有高亮显示的前景色
COLOR_HIGHLIGHTED_BORDER:
常量值为5,表示屏幕上被高亮显示的边框颜色
COLOR_HIGHLIGHTED_FOREGROUND:
常量值为3,表示用于绘制一个高亮的文本或简单图形的颜色
1.3Displayable类和Screen类
Displayable类可以在手机屏幕上显示,一个MIDlet只可能有一个Display,可以有多个Displayable对象,但是在同一时刻只能显示一个Displayable对象。
其直接子类有:
Canvas/Screen
Displayable 类中提供的成员函数
publicvoidsetTitle(Strings):
设置标题;
publicvoidsetTicker(Tickerticker):
为Displayable对象设置滚动条;
publicTickergetTicker():
返回Displayable对象的滚动条;
publicBooleanisShown():
判断当前Displayable对象是否被显示;
publicaddCommand(Commandcmd):
为Displayable添加一个命令按钮;
publicvoidremoveCommand(Commandcmd):
从Displayable中删除一个命令按钮;
publicvoidsetCommandListener(CommandListener1):
设置命令按钮监听器;
publicintgetWidth():
;返回对象的宽度;
publicintgetHeight();返回对象的高度;
protectedvoidsizeChanged(intw,inth),只能在派生类中使用,当Displayable对象的大小改变时,将触发sizeChanged函数执行。
1.4手机命令按钮的使用
1.4.1Command
该类位于:
javax.microedition.lcdui.Command;
该类直接继承Object对象。
构造函数:
1)命令按钮的第一个构造函数
publicCommand(Stringlabel,intcommandType,intpriority)
参数说明:
label:
命令按钮上显示的标签
CommandType:
是命令按钮的类型,可以使用的类型有:
Command.SCREEN、Command.BACK、Command.CANCEL、Command.OK、Command.HELP、Command.ITEM、Command.STOP、Command.EXIT。
Priority:
命令按钮的优先级,即命令按钮的重要性。
程序4~2:
说明:
本程序演示命令按钮的使用。
importjavax.microedition.lcdui.Command;
importjavax.microedition.lcdui.Display;
importjavax.microedition.lcdui.Form;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
publicclassTextendsMIDlet{
publicT(){
//TODOAuto-generatedconstructorstub
}
Displaydisplay;
FormfrmMain=newForm("命令按钮长标签演示");//创建表单,设置标题
CommandcmdScreen1=newCommand("SCREEN1",
Command.SCREEN,1);//创建命令按钮,名称为cmdScreen1
CommandcmdScreen2=newCommand("SCREEN2",Command.SCREEN,2);
//创建命令按钮,名称为cmdScreen2
protectedvoidstartApp()throwsMIDletStateChangeException{
display=Display.getDisplay(this);
frmMain.addCommand(cmdScreen1);//通过addCommand方法将cmdScreen1加到表单中
frmMain.addCommand(cmdScreen2);//通过addCommand方法将cmdScreen2加到表单中
display.setCurrent(frmMain);//将frmMain设置为当前显示
}
protectedvoidpauseApp(){
//TODOAuto-generatedmethodstub
}
protectedvoiddestroyApp(booleanarg0)
throwsMIDletStateChangeException{
//TODOAuto-generatedmethodstub
}
}
运行界面:
图4.1
2)命令按钮的另外一个构造函数定义如下:
publicCommand(Stringlabel,intcommandType,intpriority)
实际上,每个按钮都有短标签和长标签两个标签,两个标签都可以为空,长标签可以被显示时(有足够的空间显示长标签),命令按钮首先显示长标签;当没有足够的空间显示长标签时,系统将选择显示短标签。
参数commandType和priority和第一种构造函数相同。
命令按钮的短标签可以通过getLabel函数返回,长标签可以通过getLongLabel函数返回。
程序4~3
说明:
本程序演示长标签和短标签的使用
publicclassLongLabelextendsMIDlet{
Displaydisplay;
FormfrmMain=newForm("命令按钮长标签演示");
CommandcmdScreen1=newCommand("SCREEN1","Thisisashortlabel!
",
Command.SCREEN,1);//有足够的空间显示长标签,则显示长标签
CommandcmdScreen2=newCommand("SCREEN2",
"Thisisaveryvaryveryvaryveryvarylonglabel!
",Command.SCREEN,2);//没有足够的空间显示长标签,则显示短标签
CommandcmdScreen3=newCommand("AShortLable",Command.SCREEN,3);
CommandcmdExit1=newCommand("EXIT1",Command.EXIT,1);
publicLongLabel(){
super();
}
protectedvoidstartApp()throwsMIDletStateChangeException{
display=Display.getDisplay(this);
frmMain.addCommand(cmdScreen3);
frmMain.addCommand(cmdScreen2);
frmMain.addCommand(cmdScreen1);
frmMain.addCommand(cmdExit1);
display.setCurrent(frmMain);
}
protectedvoidpauseApp(){
}
protectedvoiddestroyApp(booleanarg0)
throwsMIDletStateChangeException{
}
}
运行效果
图4.2
注意:
不同的手机生产厂商之间,以及同一手机生产厂商的不同模拟器之间都存在着一定的不同。
1.4.2CommandType命令按钮的类型
在创建命令按钮时,可以通过commandType参数设置命令按钮的类型,命令按钮的类型可以getCommandType函数返回。
在MIDP2.0规范中定义了如表4-1所示的几种命令按钮类型。
表4.1命令按钮的类型及其作用
类型
常量值
使用方法
BACK
2
通常用于在多个屏幕之间进行导航,返回上一个屏幕的功能不会自动实现,需要开发人员通过代码进行控制
CANCEL
3
可以被用在对话框中,用于提供一个否定的回答,取消某些操作,通常用于和OK类型一起使用。
该类型的按钮并没有提供取消操作的代码,开发人员需要根据实际情况自己添加处理代码。
当有多个屏幕时,CANCEL类型命令可以用来取消当前屏幕上的一些操作,并返回上一个屏幕,该功能和BACK类似,但是CANCEL更强调取消了某种操作
EXIT
7
用于退出当前应用,退出代码需要开发人员自己添加
HELP
5
用于提供在线帮助,具体的帮助内容需要开发人员自己实现
ITEM
8
可以提示其实现是屏幕的一个条目或者是Choice组件的一个元素,相对于SCREEN类型而言,ITEM类型表示命令按钮是屏幕布局的一个部分
OK
4
可以被用在对话框中,用于提供一个肯定的回答,确认某些操作,通常和CANCEL类型一起使用。
该类型的按钮并没有提供确定以后的操作,开发人员需要根据实际情况自己添加处理代码。
当有多个屏幕时,OK类型命令可以用来确定在这个屏幕上输入的数据并跳转到下一个屏幕
SCREEN
1
当要执行的命令适合于整个屏幕,例如“保存”、“打开”功能,或者用于进行屏幕切换时,可以使用该类型,想对于ITEM类型而言,SCREEN类型表示命令按钮是屏幕的一个部分
STOP
6
可以用于停止某些正在运行的操作,进程等,通常不许要进行屏幕切换,停止操作的代码需要开发人员自己完成
程序4~4
说明:
本程序演示命令按钮类型对命令按钮位置及顺序的影响。
publicclassCommandTypeextendsMIDlet{
Displaydisplay;
FormfrmMain=newForm("命令按钮类型演示");
//命令按钮
CommandcmdScreen1=newCommand("SCREEN1",Command.SCREEN,1);
CommandcmdScreen2=newCommand("SCREEN2",Command.SCREEN,1);
CommandcmdItem1=newCommand("ITEM1",Command.ITEM,1);
CommandcmdItem2=newCommand("ITEM2",Command.ITEM,1);
CommandcmdExit2=newCommand("EXIT2",Command.EXIT,1);
CommandcmdExit1=newCommand("EXIT1",Command.EXIT,1);
CommandcmdBack1=newCommand("BACK1",Command.BACK,1);
CommandcmdBack2=newCommand("BACK2",Command.BACK,1);
CommandcmdCancel1=newCommand("CANCEL1",Command.CANCEL,1);
CommandcmdCancel2=newCommand("CANCEL2",Command.CANCEL,1);
CommandcmdHelp1=newCommand("HELP1",Command.HELP,1);
CommandcmdHelp2=newCommand("HELP2",Command.HELP,1);
CommandcmdOk1=newCommand("OK1",Command.OK,1);
CommandcmdOk2=newCommand("OK2",Command.OK,1);
CommandcmdStop1=newCommand("STOP1",Command.STOP,1);
CommandcmdStop2=newCommand("STOP2",Command.STOP,1);
publicCommandTyp