第5章-低级用户界面编程.ppt
《第5章-低级用户界面编程.ppt》由会员分享,可在线阅读,更多相关《第5章-低级用户界面编程.ppt(100页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、v第5章 低级用户界面编程v高级用户界面API使用起来比较简单,且具有较高的可移植性,但由于是通过底层的MIDP实现来控制最终的UI显示,因此无法实现对屏幕UI组件外观的精确控制。v在一些手机游戏等程序的实现中,要求开发人员必须对屏幕画面的每一个细节都要进行精确控制,这就需要用到低级用户界面API来进行界面开发。v利用低级用户界面API,开发者可以对界面进行更精确的控制,但在获得更大的灵活性的同时也失去了可移植性。v CanvasCanvas简介简介5.1低级事件的处理低级事件的处理5.2 Graphics Graphics 开发简介开发简介5.3 MIDP Timer APIMIDP Tim
2、er API5.45.1 Canvas简介v正如高级界面屏幕类都继承Screen类一样,我们要用到低级用户界面必须要继承Canvas这个抽象类,Canvas是Displayable的直接子类,属于J2ME中的低级API。v用户利用这些低级API可对设备精确控制,如绘制像素、接收原始的用户输入事件等。v与高级API相比控制更加灵活,但这是以其复杂性、高成本为代价的,并牺牲了一定的可移植性。它的基本用法与其他Displayable对象一致。v低级用户界面编程必须使用两个关键类:Canvas类和Graphics类。vCanvas是个抽象类,代表要绘制的抽象屏幕。为使用低层API建立用户界面,应用程序
3、必须建立Canvas的一个子类,并实现paint()方法。vGraphics类的实例是作为参数传递给paint()的,它提供了设备绘图能力的入口,它允许在像素层面直接与显示设备交互操作。任何时候系统需要绘制屏幕时,都将调用Canvas类的paint()方法。v低级用户界面编程的核心任务在于在Canvas类的paint()方法中如何利用Graphics对象进行绘图操作。vCanvas的核心是paint()这个方法,这个方法做是负责绘制屏幕上的画面,应用程序必须实现这个抽象方法。在paint()方法中有一个参数是Graphics对象,可以利用Graphics类提供的各种方法进行绘图。v因此继承Ca
4、nvas类的程序结构如下:vclassMyCanvasextendsCanvasvvprotectedvoidpaint(Graphicsg)vvvv任何时候都可以通过调用repaint()方法来产生重绘事件,它有两个方法,一共需要四个参数,分别用来指示起始坐标(X,Y)和长宽,另一个则不需要任何参数,代表整个画面重新绘制。vpublicfinalvoidrepaint(intx,inty,intwidth,intheight)v在低级UI里,我们可以直接把Graphics渲染到屏幕上,也可以在屏幕外把Graphics合成到一个Image中。v已渲染的图形具体是合成Image还是显示到屏幕上,
5、要由这个Graphics具体的来源而定,而渲染到屏幕上的Graphics对象将被送到paint()方法中来进行调度,这也是图形显示在屏幕上的唯一的途径。v只有在paint()方法的执行期间这个应用程序才可以对Graphics进行操作,至于要渲染到Image中的Graphics对象,当需要调用它的时候,可以通过Image.getGraphics()方法来取得相应的Graphics,它将可以被应用程序一直占有。v我们可以通过下面的两种方法获取Canvas对象的大小:vpublicintgetHeight();/获取可显示区域的高度(以像素为单位)vpublicintgetWidth();/获取可显
6、示区域的宽度(以像素为单位)vimportjavax.microedition.lcdui.Display;vimportjavax.microedition.midlet.MIDlet;vimportjavax.microedition.midlet.MIDletStateChangeException;vpublicclassCanvasTestextendsMIDletvprivateDisplaydisplay;vMyCanvasmc;vpublicCanvasTest()vvprotectedvoidstartApp()throwsMIDletStateChangeException
7、vdisplay=Display.getDisplay(this);vmc=newMyCanvas();vdisplay.setCurrent(mc);vvprotectedvoidpauseApp()vvprotectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeExceptionvvpublicclassMyCanvasextendsCanvasvprotectedvoidpaint(Graphicsg)vg.setColor(255,255,255);vg.fillRect(0,0,getWidth(),getHeight();v
8、g.setColor(0,0,255);vg.drawString(“thisisacanvas,10,10,Graphics.TOP|Graphics.LEFT);vvv5.2低级事件的处理v尽管通过Graphics对象可以实现绘制复杂的用户交互界面,但是,还必须存在一种底层机制来支持UI界面和用户之间的交互。Canvas为程序开发人员提供底层事件处理支持。底层事件大致可分为三类:PressEvents(按键事件)、ActionKeys(动作按键)和PointerEvents(触控事件)。但设备具体支持那些系统事件,必须由硬件的支持程度来判断。Canvas提供了一系列的方法供侦测硬件的支持程
9、度。事件名称侦测法回调函数键盘事件一定支持keyPressed(int keyCode)keyReleased(int keycode)键盘连发Canvas.hasRepeatedEvent()无屏幕事件一定支持showNotify()重绘事件一定支持Paint(Graphics g)是否支持双缓存Canvas.isDoubleBuffered()是否支持触控Canvas.hasPointerEvents()是否支持触控屏幕拖拽Canvas.hasPointerMotionEvents()5.2.1 按键事件v使用Canvas类的一个好处是可以获得键盘输入的按键代码,按键事件的几个核心方法是。
10、vkeyPressed()、keyReleased()、keyRepeated(),当按键按下时会触发keyPressed(),当松开按键时,会触发keyReleased(),当长时间按住按键时会触发keyRepeated(),但是RepeatEvents不是JTWI要求强制支持的,所以程序开发人员使用之前一定要调用hasRepeatEvents()方法来进行测试,看设备是否支持。v在Canvas里面每按下一个按键都会触发keyPressed()方法,并传入相应位置的整数值,我们在MIDP规范中可以很容易发现,KEY_NUM0KEY_NUM9十个常数分别代表键盘上的09。v还有两个功能键,KE
11、Y_STAR,KEY_POUND,如果我们传入的值小于0,代表我们传入了不合法的keyCode,某些设备上还支持连续按键响应,但这并不是JTWI规定要支持的,所以我们在进行实际开发之前一定要用前面讲到的hasRepeatEvents()方法来进行判定。按按键按按键代代码按按键代代码的的数数值0KEY_NUM0481KEY_NUM1492KEY_NUM2503KEY_NUM3514KEY_NUM4525KEY_NUM5536KEY_NUM6547KEY_NUM7558KEY_NUM8569KEY_NUM957*KEY_STAR42#KEY_POUND35v一般来说在继承Canvas的类中只要重载
12、这三个方法就可以了。当按键被按下的时候,按键的代码会自动的传给这三个方法。5.2.2 游戏动作处理vgameAction是一种将手机键盘映射成为游戏动作的机制,通过这种机制,可以使不同手机上的按键都能转换为类似或者是相同的游戏动作,这样更方便用户对于游戏的操纵。游戏程序的开发人员根据游戏动作来设计游戏也大大提高游戏的可移植性。至于具体哪个键对应哪个游戏动作是由不同的MIDP实现来完成这一映射的,不同的手机厂商和设备可能具有不同的MIDP实现。v可以在程序中通过以下代码来获取特定的游戏动作对应的按键:intaction=getGameAction(keyCode);其中,MIDP中定义的游戏动作
13、有:Canvas.UP、Canvas.DOWN、Canvas.LEFT、Canvas.RIGHT、Canvas.FIRE、Game_A、Game_B、Game_C、Game_D。v但这些按键需要通过getGameAction方法进行处理键盘代码。当按下这些按键时会映射到我们为每个按键事件编写的方法,来完成一些动作。v程序:GameActionCanvas.javavimportjavax.microedition.lcdui.Canvas;vimportjavax.microedition.lcdui.Graphics;vimportjavax.microedition.lcdui.Ticke
14、r;vpublicclassGameActionCanvasextendsCanvasvStringpromote=;vintcx,cy;vpublicGameActionCanvas()vsuper();vcx=getWidth()/2;vcy=getHeight()/2;vvpublicvoidpaint(Graphicsg)vvg.setColor(255,255,255);vg.fillRect(0,0,getWidth(),getHeight();vg.setColor(0,0,0);vg.fillArc(cx,cy,30,30,0,360);vg.drawString(promot
15、e,10,this.getHeight()-20,Graphics.TOP|Graphics.LEFT);vvvprotectedvoidkeyPressed(intkeycode)vif(keycode=getKeyCode(Canvas.UP)vif(cy20)cy-=20;vvif(keycode=getKeyCode(Canvas.DOWN)vif(cy20)cx-=20;vvif(keycode=getKeyCode(Canvas.RIGHT)vif(cxthis.getWidth()-20)cx+=20;vvpromote=getKeyValue(keycode);vrepaint
16、();vvprotectedvoidkeyReleased(intkeycode)vvvpublicStringgetKeyValue(intkeycode)vStringnKey=非数字键;vStringAction=未知游戏动作;vif(keycode=Canvas.KEY_NUM0)nKey=数字键0;vif(keycode=Canvas.KEY_NUM1)nKey=数字键1;vif(keycode=Canvas.KEY_NUM2)nKey=数字键2;vif(keycode=Canvas.KEY_NUM3)nKey=数字键3;vif(keycode=Canvas.KEY_NUM4)nKe
17、y=数字键4;vif(keycode=Canvas.KEY_NUM5)nKey=数字键5;vif(keycode=Canvas.KEY_NUM6)nKey=数字键6;vif(keycode=Canvas.KEY_NUM7)nKey=数字键7;vif(keycode=Canvas.KEY_NUM8)nKey=数字键8;vif(keycode=Canvas.KEY_NUM9)nKey=数字键9;vif(keycode=Canvas.KEY_STAR)nKey=键*;vif(keycode=Canvas.KEY_POUND)nKey=键#;vvinttemp=getGameAction(keycod
18、e);vswitch(getGameAction(keycode)vcaseCanvas.UP:vAction=游戏动作向上;break;vcaseCanvas.DOWN:vAction=游戏动作向下;break;vcaseCanvas.LEFT:vAction=游戏动作向左;break;vcaseCanvas.RIGHT:vAction=游戏动作向右;break;vcaseCanvas.FIRE:vAction=游戏动作执行;break;vcaseCanvas.GAME_A:vAction=游戏动作A;break;vcaseCanvas.GAME_B:vv图图 游戏动作的处理游戏动作的处理
19、5.2.3 5.2.3 触控事件v触控事件主要面向具备触控屏幕的高端设备,并非JTWI要求强制支持的,触控事件处理的核心方法为:pointerPressed()、pointerReleased()和pointerDragged(),分别对应程序开发人员通常所用的移动设备手写笔的按下和松开、拖曳三个动作,程序开发人员在这三个方法里可以定义相应的事件处理函数。(1)pointerPressed(intx,inty)(2)pointerReleased(intx,inty)(3)pointerDragged(intx,inty)当然,并不是所有的设备都支持指针设备,可以采用一些方法判断设备是否支持指
20、针设备。(1)hasPointerEvents()(2)hasPointerMotionEvents()vimportjavax.microedition.lcdui.Canvas;vimportjavax.microedition.lcdui.Graphics;vpublicclassPointerEventCanvasextendsCanvasvintstart_x=0;vintstart_y=0;vintend_x=0;vintend_y=0;vprotectedvoidpaint(Graphicsg)vg.setColor(0 xffffff);vg.fillRect(0,0,getW
21、idth(),getHeight();vg.setColor(0 xff0000);vg.drawLine(start_x,start_y,end_x,end_y);vvvprotectedvoidpointerPressed(intx,inty)vstart_x=x;vstart_y=y;vrepaint();vSystem.out.println(x);vSystem.out.println(y);vvprotectedvoidpointerReleased(intx,inty)vend_y=y;vend_x=x;vvprotectedvoidpointerDragged(intx,int
22、y)vend_x=x;vend_y=y;vrepaint();vv5.3 屏幕事件处理v屏幕显示与隐藏事件低级屏幕显示或隐藏时,将自动触发屏幕显示或隐藏事件,并调用相应的回调方法。在Canvas对象显示在屏幕上之前,MIDP实现会首先调用shownotify()方法。Canvas类中这个方法的默认实现是空的,即不作任何处理。Canvas的子类可以重载这个方法,用来在它被显示之前执行一些任务,比如设置动画、启动计时器等。在Canvas对象被从显示屏上删除之后,MIDP实现会立即调用hideNotify()方法,这个方法的默认实现也是空的,Canvas的子类可以重载这个方法,用来执行一些Canva
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 低级 用户界面 编程
限制150内