MIDP高级图形用户界面详解

来源:互联网 发布:日本动漫推荐 知乎 编辑:程序博客网 时间:2024/05/17 01:00
一、MIDP图形用户界面(UI)简介
图形用户界面编程在程序开发中非常重要,因为这是程序和用户之间交互的桥梁。
在J2SE中我们可以通过AWT/Swing开发图形用户界面,也可以使用SWT,AWT/Swing主要是针对桌面应用程序而设计。但由于移动设备的显示屏幕和键盘实是种类太多了,几乎每个厂家都多多少少有所不同,设备的性能也比较有限,因此没有采用AWT/Swing作为MIDP的图形用户界面库,而建立了MIDP(Mobile Information Device Profile)用户界面应用编程接口类(javax.microedition.lcdui.*)来实现J2ME的图形界面开发。
MIDP用户界面设计是基于屏幕的,所有的用户界面组件都位于屏幕上,并且一次只显示一个屏幕,并且只能浏览或使用这个屏幕上的条目。由屏幕来处理所有的用户界面事件。并只把高级事件传送给应用。
按照MIDP2.0的规范,MIDP图形用户界面分为低级图形用户界面和高级图形用户界面。首先我们通过图表来展示一下MIDP2.0中图形用户界面的体系结构:

从结构中我们可以看到,MIDP中使用类Display进行用户界面的管理,负责与应用程序管理器进行交互,并且用Displayable的子类(Screen, Canvas)代表可以显示的用户界面。
Display代表了系统显示屏幕和输入设备的管理器,用来获取设备属性的方法以及向设备建议应该显示的对象。
Displayable类在设备显示屏幕上的用户对象就是Display对象,在同一时刻应用程序最多只有一个Displayable对象被显示在屏幕上,通过它可以同用户进行交互。
Screen是高级图形用户界面的超类,它封装了完整的用户界面组件;Canvas是低级图形用户界面的超类,它允许应用程序进行图形处理和输入处理的低层对象。任何MIDP应用程序都可以将Screen和Canvas整合来展示一个集成后的应用程序接口,例如,在一个游戏中,List和Form可以被用来选择或者配置游戏选项,而Canvas可以用于交互式的游戏界面。
 
(本文只介绍高级图形用户界面)
 
二、MIDP高级UI分析
 
1、 高级图形用户界面分析
Screen的主要结构图为:

Screen的四个子类分别是TextBox,List,Alert和Form。
 
下面我们分别来描述一下这四个高级图形用户界面组件的功能。
(1)TextBox是提供给用户输入多行数据的组件,我们也可以对用户的输入进行类型的限制。当我们要在移动设备上输入数据时,TextBox就派上用场了。需要注意的一点是:一个TextBox必须附加一个命令Command,否则,用户将不能激发任何行为,而陷入这个TextBox中。
TextBox类的构造方法是:
TextBox(String title, String text, int maxSize, int constraints),参数分别是标题、初始内容、允许输入的最大字数、限制类型(在TextField类中定义的静态成员)。
界面如下图:

(2)List用于从预定的选项中进行选取,可以理解为一个包含一系列选项的容器。
它实现了Choice接口,一共有三种具体的类型:implicit(简易式),exclusive(单选式),multiple(多选式)。
用于约束List具体类型的类是ChoiceGroup,List中的元素可以用getString、insert、set、append、delete、getImage等方法来具体操纵,对于项目的选择我们则使用getSelectedIndex()、setSelectedIndex()、getSelectedFlags()、setSelectedFlags()和isSelected()来处理。
界面如下图:

(3)Alert用来提醒用户关于错误或者其他异常情况的屏幕对象,这个警告只能作为简短的信息记录和提醒。
Alert是一个比较特殊的屏幕对象,当我们在setCurrent()方法中调用它的时候,它会先发出一段警告的声音,然后彩绘显示在屏幕上,过了一段时间之后,它会自动跳回之前的画面。在Alert中我们可以通过setTimeout()方法来设定间隔的时间,setType()来调用我们上面提到的四种类型,setImage()来定义图片,setString()来定义内含文字,同时通过getType(),getImage(),getString()来取得相应的对象。
界面如下图:

(4)Form是J2ME里面一个比较重要的容器类型,可以说是集中了高级UI中的精华,是开发当中常常用到的一个关键类。
我们通常是往Form里面添加个中Item的子类(使用append()方法),从而达到让画面更加丰富的目的,每一个Item的子类在同一时刻只能属于同一个容器,否则会引发异常。
在Form画面中,我们通过Item.LAYOUT_LEFT、Item.LAYOUT_CENTER和Item.LAYOUT_RIGHT来控制各个Item在Form的位置,通过这几个参数的字面意思我们很容易明白分别是左,中,右。在不设定的情况下,Item会依照LAYOUT_DEFAULT来绘制,如果我们希望自己来设定等效线,可以用setLayout()这个方法来控制。
下图很好的说明了FORM及其相关子类的关系:

(5)下面我们介绍Item类,它是所有能够被添加到Form容器上的组件的父类,我们来看看Item的继承结构图: 

在MIDP2.0中,Item的子类共有8个,他们的功能各不相同。
TextField类是我们经常使用的,它只能提供单行的输入;
DateField类提供给用户输入日期的功能;
ChoicGroup同样是实现了Choice接口,我们可以通过模式来把它用作单选和多选;
Gauge的最大用处就是拿来当进度显示使用;
Spacer的用处很简单,就是加一处空白;
StringItem的作用就是在屏幕上显示一串字符;
ImageItem的作用是显示图像;
CustomItem是在MIDP2.0中提供给用户的,其实它是介于高级和低级之间的用户界面,
我们可以把它叫做增强型图形用户界面,因为它可以添加到Form中,且可以通过实现一系列的抽象方法来绘制自己。比如你可以实现一个表格组件。CustomItem是Item中一个比较重要的子类,它最大的优点是提高了Form中的可交互性。
    注意:因为ChoiceGroup和List都实现了Choice接口,所以基本一样,区别有两点:a、ChoiceGroup不能使用List中的Choice.IMPLICIT类型,只能用Choice.POPUP;
b、List占据了整个屏幕,而ChoiceGroup只是Form中的一个组件。
2、MIDP图形用户界面中的事件处理机制。
 
(1)在高级图形用户界面中我们必须了解的是三个Listener和一个Command。其中的原理就是回调机制,回调在图形界面编程中广泛采用,它的原理就是底层函数调用高层函数。
在java中我们定义一个接口,比如CommandListener,接口中定义一个方法比如commandAction(Command cmd,Displayable displayable)。当用户触发事件发生的时候,比如用户按下了一个Command,那么定义在CommandListener中的commandAction()方法会被调用,来处理相关的操作。
其他两个Listener,ItemStateListener和ItemCommandListener的原理和CommandListener的原理一样。
使用高级事件处理的时候,我们遵循的步骤就是,实现接口-注册监听器。
(2)低级事件处理比较复杂,需要我们判断用户的输入来进行相应的处理。
a、针对键盘事件,如下三个方法用来接收用户的输入
keyPressed(int keyCode)
keyReleased(int keyCode)
keyRepeated(int keyCode)
b、针对触摸屏事件,我们可以通过如下方法来接受用户输入事件。
pointerDragged(int x, int y)
pointerPressed(int x, int y)
pointerReleased(int x, int y)