JME編程-低級用戶界面編程_第1頁
JME編程-低級用戶界面編程_第2頁
JME編程-低級用戶界面編程_第3頁
JME編程-低級用戶界面編程_第4頁
JME編程-低級用戶界面編程_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

JME編程-低級用戶界面編程學(xué)習內(nèi)容1低級用戶界面編程概述2Graphics繪圖3底層事件處理4高級Command命令處理5高級事件與低級事件的并發(fā)6高級屏幕與低級屏幕的協(xié)同7屏幕事件處理8深入研究屏幕繪制9開發(fā)自定義組件小結(jié)1低級用戶界面編程概述

高級用戶界面API使用起來比較簡單,且具有較高的可移植性,但由于是通過底層的MIDP實現(xiàn)來控制最終的UI顯示,因此無法實現(xiàn)對屏幕UI組件外觀的精確控制。在一些手機游戲等程序的實現(xiàn)中,要求開發(fā)人員必須對屏幕畫面的每一個細節(jié)都要進行精確控制,這就需要用到低級用戶界面API來進行界面開發(fā)。

MIDP為程序開發(fā)人員提供了一組低層API。低層API由Canvas類和一組輔助支撐類(例如圖形、字體和圖像)組成。用戶利用這些低級API可對設(shè)備精確控制,如繪制像素、接收原始的用戶輸入事件等。與高級API相比,開發(fā)人員可以更加靈活地控制屏幕繪制,但同時開發(fā)的復(fù)雜程度也大大提高,并在一定程度上喪失了程序的移植性。因此利用低級用戶界面API,開發(fā)者可以對界面進行更精確的控制,但在獲得更大的靈活性的同時也失去了可移植性。屏幕繪制類低級用戶界面編程必須使用兩個關(guān)鍵類:Canvas類、Graphics類其中:

Canvas是個抽象類,代表要繪制的抽象屏幕。為使用低層API建立用戶界面,應(yīng)用程序必須建立Canvas的一個子類,并實現(xiàn)paint()方法。

Graphics類的實例是作為參數(shù)傳遞給paint()的,它提供了設(shè)備繪圖能力的入口,它允許在像素層面直接與顯示設(shè)備交互操作。任何時候系統(tǒng)需要繪制屏幕時,都將調(diào)用Canvas類的paint()方法。低級用戶界面開發(fā)示例程序7-1:MyCanvas.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassMyCanvasextendsCanvas{protectedvoidpaint(Graphicsg){g.setColor(255,255,255);g.fillRect(0,0,getWidth(),getHeight());g.setColor(0,0,255);g.drawString(“Hello,world”,10,10,Graphics.TOP|Graphics.LEFT); }}程序7-2:CanvasTest.javaimportjavax.microedition.lcdui.Display;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassCanvasTestextendsMIDlet{ privateDisplaydisplay; publicCanvasTest(){ super(); } protectedvoidstartApp()throwsMIDletStateChangeException{ display=Display.getDisplay(this); MyCanvasmc=newMyCanvas(); display.setCurrent(mc); } protectedvoidpauseApp(){ } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ }}圖7-1程序7-2運行結(jié)果畫面方法一低級用戶界面開發(fā)步驟:1、新建一個MidletSuite項目。2、新建一個一般的JAVACLASS文件,輸入低級用戶界面的代碼。3、新建一個Midlet應(yīng)用程序,調(diào)用低級用戶界面。方法二在一個文檔中完成所有的代碼。低級用戶界面開發(fā)步驟:1、新建一個MidletSuite項目。新建一個Midlet應(yīng)用程序,在主程序框架中調(diào)用低級用戶界面。在該文檔中建立一個類文件,完成低級用戶界面的設(shè)計。范例如下:importjavax.microedition.lcdui.Display;importjavax.microedition.midlet.MIDlet; importjavax.microedition.midlet.MIDletStateChangeException; importjavax.microedition.lcdui.Canvas; importjavax.microedition.lcdui.Graphics;//注意:低級用戶界面的所有的包也需要在開始時導(dǎo)入,否則會報錯。

publicclassmyCanvaseTestextendsMIDlet{ privateDisplaydisplay; publicmyCanvaseTest(){ super(); } protectedvoidstartApp()throwsMIDletStateChangeException{ display=Display.getDisplay(this); myCanvasmc=newmyCanvas(); display.setCurrent(mc); } protectedvoidpauseApp(){ } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{} } classmyCanvasextendsCanvas{ //注意:該低級用戶界面類前不能有修飾詞public protectedvoidpaint(Graphicsg){ g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(0,0,255); g.drawString("Hello,world",10,10,Graphics.TOP|Graphics.LEFT);} }屏幕重繪

任何時候開發(fā)人員都可以用repaint()來產(chǎn)生重繪事件,從而間接調(diào)用Canvas類的paint()方法繪制屏幕。repaint()一共有兩個同名方法,其中一個需要四個參數(shù),分別是起始坐標(x,y),還有寬度和高度,另外一個不需要任何參數(shù),它是代表整個屏幕全部重新繪制,顯然,前者的效率較后者要高,實際開發(fā)中也大多數(shù)是用前者而不是后者。

repaint(intx,inty,intwidth,intheight)

用來請求重畫屏幕上指定區(qū)域

repaint()

請求重畫整個畫布,效果等同于repaint(0,0,getWidth(),getHeight());注意:在應(yīng)用程序中永遠不要自行調(diào)用paint()方法,要重畫屏幕或者重畫屏幕中的一部分,應(yīng)當使用repaint()方法。2Graphics繪圖2.1Graphics繪圖坐標圖7-2繪圖坐標系對比XY笛卡兒坐標系XYGaphics繪圖坐標系

2.2顏色操作

在繪制任何對象之前,必須首先為Graphics對象指定當前顏色,然后就能按照預(yù)先設(shè)定顏色顯示繪制的各種對象??梢允褂萌缦路椒ㄟM行顏色設(shè)定。

voidsetColor(intRGB)voidsetColor(intred,intgreen,intblue)voidsetGrayScale(intvalue)范例:

g.setColor(0x000000);g.setColor(0,0,0);g.setGrayScal(100);2.3繪圖操作Graphics繪圖內(nèi)容:繪制幾何圖形繪制文本繪制圖像2.3繪圖操作表7-1Graphics常見繪圖操作方法說明voiddrawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)繪制弧形voiddrawChar(charcharacter,intx,inty,intanchor)繪制特定字符voiddrawChars(char[]data,intoffset,intlength,intx,inty,intanchor)繪制字符數(shù)組VoiddrawImage(Imageimg,intx,inty,intanchor)繪制一幅圖像voiddrawLine(intx1,inty1,intx2,inty2)繪制一條直線voiddrawRect(intx,inty,intwidth,intheight)繪制一個矩形voiddrawRegion(Imagesrc,intx_src,inty_src,intwidth,intheight,inttransform,intx_dest,inty_dest,intanchor)拷貝圖像的一部分并經(jīng)過轉(zhuǎn)換后復(fù)制到一指定位置voiddrawRGB(int[]rgbData,intoffset,intscanlength,intx,inty,intwidth,intheight,booleanprocessAlpha)繪制一組設(shè)備獨立的RGB和透明度值到一指定區(qū)域.voiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)繪制一個圓角矩形voiddrawString(Stringstr,intx,inty,intanchor)繪制字符串voiddrawSubstring(Stringstr,intoffset,intlen,intx,inty,intanchor)繪制特定字符串的一部分voidfillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)填充指定矩形內(nèi)的圓或橢圓voidfillRect(intx,inty,intwidth,intheight)填充矩形voidfillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)填充圓角矩形voidfillTriangle(intx1,inty1,intx2,inty2,intx3,inty3)填充三角形2.4繪制幾何圖形程序7-4:GraphicsDemo.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassGraphicsDemoextendsCanvas{protectedvoidpaint(Graphicsg){g.drawRect(20,30,30,30);g.setColor(0,255,0);g.fillRect(60,60,30,30);g.setColor(255,255,0);g.drawArc(100,100,50,50,0,360);g.fillArc(160,160,50,50,0,270);g.setColor(0xff0000);g.fillTriangle(10,100,90,160,10,140); }}圖7-6繪制各種幾何圖形2.5線型Graphics類中保留了繪制各種圖形時使用的2個式樣的線條類型:虛線DOTTED和實線SOLID。由于fill方法繪制的是填充圖形而draw方法繪制的是線框圖形,因此draw方法下,線型的指定是有效的,而在fill方法中線型的設(shè)定是無效的。

可以利用以下方法設(shè)定線形:voidsetStrokeStyle(intstyle)其中,若要指定DOTTED時,Graphics類的參數(shù)就是Graphics.DOTTED,指定SOLID時,Graphics類的參數(shù)就是Graphics.SOLID。程序7-5:StrokeStyleCanvas.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassStrokeStyleCanvasextendsCanvas{ protectedvoidpaint(Graphicsg){ g.setStrokeStyle(Graphics.SOLID); g.drawRect(10,10,150,150); g.setStrokeStyle(Graphics.DOTTED); g.drawRect(30,30,120,120);

}}圖7-7不同線型下的圖形繪制效果2.6繪制文本可以使用以下方法描繪Canvas上的文本:

voiddrawChar(charcharacter,intx,inty,intanchor)voiddrawChar(char[]data,intoffset,intlength,intx,inty,intanchor)voiddrawString(Stringstring,intx,inty,intanchor)voiddrawSubString(Stringstr,intoffset,intlength,intx,inty,intanchor)其中:參數(shù)anchor定義定位點,有水平(LEFTHCENTERRIGHT)和垂直(TOPBASELINEVCENTERBOTTOM)兩類程序7-6:AnchorCanvas.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassAnchorCanvasextendsCanvas{ protectedvoidpaint(Graphicsgraphics){ graphics.drawString("小樓昨夜聽春雨",100,10,

Graphics.TOP|Graphics.LEFT); graphics.drawString("小樓昨夜聽春雨",100,40,

Graphics.TOP|Graphics.HCENTER); graphics.drawString("小樓昨夜聽春雨",100,70,

Graphics.TOP|Graphics.RIGHT); graphics.drawString("明朝深巷賣杏花",0,100,

Graphics.TOP|Graphics.LEFT); //graphics.drawString("白日依山盡",90,100,

// Graphics.VCENTER|Graphics.LEFT); graphics.drawString("明朝深巷賣杏花",80,100,

Graphics.BOTTOM|Graphics.LEFT); graphics.drawString("明朝深巷賣杏花",160,100,

Graphics.BASELINE|Graphics.LEFT); }}圖7-10使用不同定位點顯示文本2.7使用字體

在應(yīng)用中描繪TEXT時,底層API中有表示字體的Font類。每個Graphics都有一個Font對象與其關(guān)聯(lián),用來表示當前指定的字體信息。使用以下方法來設(shè)置Graphics的字體:voidsetFont(Fontfont)使用下面的方法來獲取當前設(shè)置的字體:staticFontgetFont(intface,intstyle,intsize)Font中有外觀、風格和大小3個屬性。各屬性的取值范圍如下:字體外觀:FACE_PROPORTIONAL、FACE_MONOSPACE、FACE_SYSTEM字體風格:STYLE_PLAIN、STYLE_BOLD、STYLE_ITALIC、STYLE_UNDERLINED字體大?。篠IZE_SMALL、SIZE_MEDIUM、SIZE_LARGE

當開發(fā)人員不對Font進行設(shè)定時,機器會自動從設(shè)備中選擇最合適的Font屬性。調(diào)用方法setFont(null)即可使字體恢復(fù)到默認狀態(tài)。程序7-7:FontCanvas.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Font;importjavax.microedition.lcdui.Graphics;publicclassFontCanvasextendsCanvas{ protectedvoidpaint(Graphicsg){Fontfont=Font.getFont(Font.FACE_SYSTEM,F(xiàn)ont.STYLE_ITALIC|Font.STYLE_BOLD,F(xiàn)ont.SIZE_LARGE); g.setFont(font); g.drawString("你好!J2ME",10,10,Graphics.LEFT|Graphics.TOP);font=Font.getFont(Font.FACE_MONOSPACE,F(xiàn)ont.STYLE_BOLD,F(xiàn)ont.SIZE_MEDIUM); g.setFont(font); g.drawString("你好!J2ME",10,50,Graphics.LEFT|Graphics.TOP);font=Font.getFont(Font.FACE_PROPORTIONAL,F(xiàn)ont.STYLE_UNDERLINED,F(xiàn)ont.SIZE_LARGE); g.setFont(font); g.drawString("你好!J2ME",10,90,Graphics.LEFT|Graphics.TOP); g.setFont(null); g.drawString("你好!J2ME",10,130,Graphics.LEFT|Graphics.TOP); }}圖7-11使用不同的字體來顯示文字信息程序7-8:FontCanvas2.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Font;importjavax.microedition.lcdui.Graphics;publicclassFontCanvas2extendsCanvas{ protectedvoidpaint(Graphicsgraphics){ Stringtext1="你好";Stringtext2="本章將詳細介紹如何利用MIDP的低級用戶界面API進行程序開發(fā)"; graphics.setColor(255,255,255); graphics.fillRect(0,0,getWidth(),getHeight()); graphics.setColor(0,0,0);graphics.drawString(text1,0,0,Graphics.TOP|Graphics.LEFT); Fontfont=graphics.getFont(); intfontHeight=font.getHeight(); if(font.stringWidth(text2)>getWidth()){//換行處理

intcWidth=font.substringWidth(text2,0,1); intnum=getWidth()/cWidth;graphics.drawSubstring(text2,0,num,0,fontHeight,Graphics.TOP|Graphics.LEFT);graphics.drawSubstring(text2,num,text2.length()-num,0,2*fontHeight,Graphics.TOP|Graphics.LEFT); }elsegraphics.drawString(text2,0,fontHeight,Graphics.TOP|Graphics.LEFT); }}圖7-12實現(xiàn)文本自動換行顯示

2.8繪制圖像可以調(diào)用Graphics類的以下方法來繪制圖像:voiddrawImage(Imageimg,intx,inty,intanchor)其中,參數(shù)anchor代表定位點屬性,水平定位:LEFT,HCENTER,RIGHT。垂直定位:TOP,BASELINE,VCENTER,BOTTOM。使用運算符”

︱”來聯(lián)合指定橫向和縱向的定位方式。Image分為可變和不可變兩種類型的,不可變的Image是從資源文件、二進制數(shù)據(jù)、RGB數(shù)值及其它Image直接創(chuàng)建的,一旦創(chuàng)建完成,Image就無法再變化。不可變的Image通過Image.createImage(Stringname)方法從指定路徑中讀取需要創(chuàng)建Image所必須的數(shù)據(jù),注意參數(shù)中的字符串必須以“/”頭,并且包括完整的名稱??勺兊腎mage以給定的大小創(chuàng)建,它是可以修改的,可變的Image由Image.createImage(intwidth,intheight)方法來創(chuàng)建,需要指定代表寬度的參數(shù)width和代表長度信息的參數(shù)height。程序7-9:ImageCanvas.javaimportjavax.microedition.lcdui.*;publicclassImageCanvasextendsCanvas{ Imageimg=null; protectedvoidpaint(Graphicsg){ if(img==null)getImage();g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP); } privatevoidgetImage(){ try{ img=Image.createImage("/butterfly.png"); }catch(Exceptione){ e.printStackTrace(); } }}圖7-13顯示Image

MIDP2.0中新增了Alpha混合特性,可以生成含有半透明的像素的圖像,圖像中的每個像素由4個字節(jié)表示,其中第一個字節(jié)用戶表示像素的透明程序,其中0表示完全透明,255表示完全模糊。程序開發(fā)人員可以使用這個特性來對圖片進行一些處理,實現(xiàn)一些特殊效果。程序7-10:AlphaCanvas.javaimportjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;importjava.io.*;publicclassAlphaCanvasextendsCanvas{privateImagebackgroundImage;privateint[]maskArray;privateint[]maskArray1;privateint[]maskArray2;privateintimageWidth;privateintimageHeight;privateintx;privateinty;privateintmaskHeight=0;publicAlphaCanvas(StringimageName){try{backgroundImage=Image.createImage(imageName);}catch(IOExceptionioe){ioe.printStackTrace();}imageWidth=backgroundImage.getWidth();imageHeight=backgroundImage.getHeight();//計算掩碼圖像的高度

maskHeight=imageHeight/3;maskArray=newint[imageWidth*maskHeight];maskArray1=newint[imageWidth*maskHeight];maskArray2=newint[imageWidth*maskHeight];for(inti=0;i<imageWidth*maskHeight;i++){maskArray[i]=0xff00FF00;//全模糊掩碼

maskArray1[i]=0x7f00FF00;//半透明掩碼

maskArray2[i]=0x0000FF00;//全透明掩碼

}x=(getWidth()-imageWidth)/2;y=(getHeight()-imageHeight)/2;}publicvoidpaint(Graphicsg){g.setColor(255,255,255);g.fillRect(0,0,getWidth(),getHeight());g.drawImage(backgroundImage,x,y,Graphics.TOP|Graphics.LEFT);g.drawRGB(maskArray,0,imageWidth,x,y,imageWidth,maskHeight,true);g.drawRGB(maskArray1,0,imageWidth,x,y+maskHeight,imageWidth,maskHeight,true);g.drawRGB(maskArray2,0,imageWidth,x,y+2*maskHeight,imageWidth,maskHeight,true);}}程序7-11:AlphaBlending.javaimportjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;publicclassAlphaBlendingextendsMIDlet{privateDisplaydisplay;privateAlphaCanvasalphaCanvas;privatestaticfinalStringIMAGE_NAME="/butterfly.png";publicAlphaBlending(){display=Display.getDisplay(this);alphaCanvas=newAlphaCanvas(IMAGE_NAME);}publicvoidstartApp(){ display.setCurrent(alphaCanvas);}publicvoidpauseApp(){}publicvoiddestroyApp(booleanunconditional){}}圖7-14利用Alpha混合特性顯示特殊效果3底層事件處理3.1檢測底層事件支持特性盡管通過Graphics對象可以實現(xiàn)繪制復(fù)雜的用戶交互界面,但是,還必須存在一種底層機制來支持UI界面和用戶之間的交互。Canvas為程序開發(fā)人員提供底層事件處理支持。底層事件大致可分為三類:PressEvents(按鍵事件)、ActionKeys(動作按鍵)和PointerEvents(觸控事件)。但設(shè)備具體支持那些系統(tǒng)事件,必須由硬件的支持程度來判斷。Canvas提供了一系列的方法供偵測硬件的支持程度。表7-2Canvas底層事件支持說明

事件名稱偵測法回調(diào)函數(shù)鍵盤事件一定支持keyPressed(intkeyCode)keyReleased(intkeycode)鍵盤連發(fā)Canvas.hasRepeatedEvent()無屏幕事件一定支持showNotify()重繪事件一定支持Paint(Graphicsg)是否支持雙緩存Canvas.isDoubleBuffered()是否支持觸控Canvas.hasPointerEvents()是否支持觸控屏幕拖拽Canvas.hasPointerMotionEvents()3.2按鍵事件的處理

按鍵事件主要用來監(jiān)控用戶對于移動設(shè)備鍵盤的操作,按鍵事件處理主要包括以下幾個核心方法為:keyPressed()、keyReleased()和keyRepeated()當按鍵按下時會觸發(fā)keyPressed();當松開按鍵時,會觸發(fā)keyReleased();當長時間按住按鍵時會觸發(fā)keyRepeated(),但是RepeatEvents不是JTWI要求強制支持的,所以程序開發(fā)人員使用之前一定要調(diào)用hasRepeatEvents()方法來進行測試,看設(shè)備是否支持。

表7-3鍵值屬性信息按鍵按鍵代碼按鍵代碼的數(shù)值0KEY_NUM0481KEY_NUM1492KEY_NUM2503KEY_NUM3514KEY_NUM4525KEY_NUM5536KEY_NUM6547KEY_NUM7558KEY_NUM8569KEY_NUM957*KEY_STAR42#KEY_POUND35低級用戶界面API捕獲按鍵事件及按鍵類型實例:見教程P160程序7-13、7-14

程序7-13importjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;/**Createdon2005-10-15**TODOTochangethetemplateforthisgeneratedfilegoto*Window-Preferences-Java-CodeStyle-CodeTemplates*//***@authorhao**TODOTochangethetemplateforthisgeneratedtypecommentgoto*Window-Preferences-Java-CodeStyle-CodeTemplates*/publicclassKeyEventCanvas2extendsCanvas{privateStringpromote=""; /*(non-Javadoc) *@seejavax.microedition.lcdui.Canvas#paint(javax.microedition.lcdui.Graphics) */publicvoidpaint(Graphicsg){g.setColor(255,255,255);g.fillRect(0,0,getWidth(),getHeight());g.setColor(255,0,0);g.drawString(promote,10,10,Graphics.TOP|Graphics.LEFT);}protectedvoidkeyPressed(intkeycode){ if(keycode==Canvas.KEY_NUM0)promote="您剛才按下的是0鍵"; if(keycode==Canvas.KEY_NUM1)promote="您剛才按下的是1鍵"; if(keycode==Canvas.KEY_NUM2)promote="您剛才按下的是2鍵"; if(keycode==Canvas.KEY_NUM3)promote="您剛才按下的是3鍵"; if(keycode==Canvas.KEY_NUM4)promote="您剛才按下的是4鍵"; if(keycode==Canvas.KEY_NUM5)promote="您剛才按下的是5鍵"; if(keycode==Canvas.KEY_NUM6)promote="您剛才按下的是6鍵"; if(keycode==Canvas.KEY_NUM7)promote="您剛才按下的是7鍵"; if(keycode==Canvas.KEY_NUM8)promote="您剛才按下的是8鍵"; if(keycode==Canvas.KEY_NUM9)promote="您剛才按下的是9鍵"; if(keycode==Canvas.KEY_STAR)promote="您剛才按下的是*鍵"; if(keycode==Canvas.KEY_POUND)promote="您剛才按下的是#鍵"; repaint();

}protectedvoidkeyReleased(intkeycode){ if(keycode==48)promote="您剛才釋放的是0鍵"; if(keycode==49)promote="您剛才釋放的是1鍵"; if(keycode==50)promote="您剛才釋放的是2鍵"; if(keycode==51)promote="您剛才釋放的是3鍵"; if(keycode==52)promote="您剛才釋放的是4鍵"; if(keycode==53)promote="您剛才釋放的是5鍵"; if(keycode==54)promote="您剛才釋放的是6鍵"; if(keycode==55)promote="您剛才釋放的是7鍵"; if(keycode==56)promote="您剛才釋放的是8鍵"; if(keycode==57)promote="您剛才釋放的是9鍵"; if(keycode==42)promote="您剛才釋放的是*鍵"; if(keycode==35)promote="您剛才釋放的是#鍵";repaint();

}}3.3游戲動作處理

gameAction是一種將手機鍵盤映射成為游戲動作的機制,通過這種機制,可以使不同手機上的按鍵都能轉(zhuǎn)換為類似或者是相同的游戲動作,這樣更方便用戶對于游戲的操縱。游戲程序的開發(fā)人員根據(jù)游戲動作來設(shè)計游戲也大大提高游戲的可移植性。至于具體哪個鍵對應(yīng)哪個游戲動作是由不同的MIDP實現(xiàn)來完成這一映射的,不同的手機廠商和設(shè)備可能具有不同的MIDP實現(xiàn)??梢栽诔绦蛑型ㄟ^以下代碼來獲取特定的游戲動作對應(yīng)的按鍵:intaction=getGameAction(keyCode);其中,MIDP中定義的游戲動作有:Canvas.UP、Canvas.DOWN、Canvas.LEFT、Canvas.RIGHT、Canvas.FIRE、Game_A、Game_B、Game_C、Game_D。程序7-15:GameActionCanvas.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;importjavax.microedition.lcdui.Ticker;publicclassGameActionCanvasextendsCanvas{ Stringpromote=""; intcx,cy;publicGameActionCanvas(){ super(); cx=getWidth()/2; cy=getHeight()/2; } publicvoidpaint(Graphicsg){g.setColor(255,255,255);g.fillRect(0,0,getWidth(),getHeight());g.setColor(0,0,0);g.fillArc(cx,cy,30,30,0,360); g.drawString(promote,10,this.getHeight()-20,Graphics.TOP|Graphics.LEFT);}protectedvoidkeyPressed(intkeycode){if(keycode==getKeyCode(Canvas.UP)){ if(cy>20)cy-=20; } if(keycode==getKeyCode(Canvas.DOWN)){ if(cy<this.getHeight()-20)cy+=20; } if(keycode==getKeyCode(Canvas.LEFT)){ if(cx>20)cx-=20; } if(keycode==getKeyCode(Canvas.RIGHT)){ if(cx<this.getWidth()-20)cx+=20; } promote=getKeyValue(keycode); repaint();}protectedvoidkeyReleased(intkeycode){}publicStringgetKeyValue(intkeycode){ StringnKey="非數(shù)字鍵"; StringAction="未知游戲動作"; if(keycode==Canvas.KEY_NUM0)nKey="數(shù)字鍵0"; if(keycode==Canvas.KEY_NUM1)nKey="數(shù)字鍵1"; if(keycode==Canvas.KEY_NUM2)nKey="數(shù)字鍵2"; if(keycode==Canvas.KEY_NUM3)nKey="數(shù)字鍵3"; if(keycode==Canvas.KEY_NUM4)nKey="數(shù)字鍵4"; if(keycode==Canvas.KEY_NUM5)nKey="數(shù)字鍵5"; if(keycode==Canvas.KEY_NUM6)nKey="數(shù)字鍵6"; if(keycode==Canvas.KEY_NUM7)nKey="數(shù)字鍵7"; if(keycode==Canvas.KEY_NUM8)nKey="數(shù)字鍵8"; if(keycode==Canvas.KEY_NUM9)nKey="數(shù)字鍵9"; if(keycode==Canvas.KEY_STAR)nKey="鍵*"; if(keycode==Canvas.KEY_POUND)nKey="鍵#"; /////////////////////////// inttemp=getGameAction(keycode); switch(getGameAction(keycode)){ caseCanvas.UP: Action="游戲動作向上";break; caseCanvas.DOWN: Action="游戲動作向下";break; caseCanvas.LEFT: Action="游戲動作向左";break; caseCanvas.RIGHT: Action="游戲動作向右";break; caseCanvas.FIRE: Action="游戲動作執(zhí)行";break; caseCanvas.GAME_A: Action="游戲動作A";break; caseCanvas.GAME_B: Action="游戲動作B";break; caseCanvas.GAME_C: Action="游戲動作C";break; caseCanvas.GAME_D: Action="游戲動作D";break; } return"您執(zhí)行了"+Action+",它對應(yīng)"+nKey;}}圖7-19游戲動作的處理3.4觸控事件的處理

觸控事件主要面向具備觸控屏幕的高端設(shè)備,并非JTWI要求強制支持的,觸控事件處理的核心方法為:pointerPressed()、pointerReleased()和pointerDragged(),分別對應(yīng)程序開發(fā)人員通常所用的移動設(shè)備手寫筆的點,擊,拖拽幾個動作,程序開發(fā)人員在這三個方法里可以定義相應(yīng)的事件處理函數(shù)。程序7-16:PointerEventCanvas.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassPointerEventCanvasextendsCanvas{intstart_x=0;intstart_y=0;intend_x=0;intend_y=0; protectedvoidpaint(Graphicsg){ g.setColor(0xffffff); g.fillRect(0,0,this.getWidth(),this.getHeight()); g.setColor(0xff0000);g.drawLine(start_x,start_y,end_x,end_y); } protectedvoidpointerPressed(intx,inty){ start_x=x; start_y=y; repaint(); System.out.println(x); System.out.println(y); }protectedvoidpointerReleased(intx,inty){ end_y=y; end_x=x; }protectedvoidpointerDragged(intx,inty){ end_x=x; end_y=y; repaint(); }}圖7-20觸控事件的處理4高級Command命令處理

在底層API用戶界面開發(fā)中仍舊可以使用高級Command命令處理機制。程序7-17:BackgroudCanvas.javaimportjavax.microedition.lcdui.*;publicclassBackgroudCanvasextendsCanvasimplementsCommandListener{privateCommandRed=newCommand("紅",Command.ITEM,1);privateCommandGreen=newCommand("綠",Command.ITEM,1);privateCommandBlue=newCommand("藍",Command.ITEM,1);intbackground=0; publicBackgroudCanvas(){ this.addCommand(Red); this.addCommand(Green); this.addCommand(Blue); this.setCommandListener(this); } protectedvoidpaint(Graphicsg){ g.setColor(background); g.fillRect(0,0,getWidth(),getHeight()); } publicvoidcommandAction(Commandc,Displayabled){if(c.equals(Red))background=0xff0000;elseif(c.equals(Green))background=0x00ff00;elseif(c.equals(Blue))background=0x0000ff; }}程序7-18:TestCommand.javaimportjavax.microedition.lcdui.Display;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassTestCommandextendsMIDlet{privateDisplays=null; publicTestCommand(){ super(); } protectedvoidstartApp()throwsMIDletStateChangeException{ s=Display.getDisplay(this); BackgroudCanvasb=newBackgroudCanvas(); s.setCurrent(b);

} protectedvoidpauseApp(){ } protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ }}圖7-21高級Command命令的處理5高級事件與低級事件的并發(fā)

若高級事件和低級事件同時發(fā)生,系統(tǒng)將自動進行判斷。如果按鍵是屬于系統(tǒng)功能按鈕,就會交給高級事件處理函數(shù)來處理,否則才會轉(zhuǎn)由低級事件來處理。有一點必須牢記:對于同一個事件,高級事件處理和低級事件處理不會依次發(fā)生,也就是說,同一個事件不會被處理兩次。程序7-19:KeyEventandCommandCanvas.javaimportjavax.microedition.lcdui.*;publicclassKeyEventandCommandCanvasextendsCanvasimplementsCommandListener{ privateStringpromote=""; publicKeyEventandCommandCanvas(){addCommand(newCommand("測試",Command.OK,1));addCommand(newCommand("退出",Command.EXIT,1));setCommandListener(this);} protectedvoidpaint(Graphicsg){ g.setColor(125,125,125); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(0,0,255); g.drawString(promote,10,10,Graphics.TOP|Graphics.LEFT); } publicvoidcommandAction(Commandc,Displayables){promote="高級命令處理函數(shù)被調(diào)用";repaint();}protectedvoidkeyPressed(intkeycode){promote="低級事件處理函數(shù)被調(diào)用";repaint();}protectedvoidkeyReleased(intkeycode){promote="低級事件處理函數(shù)被調(diào)用";repaint();}}程序7-20:KeyEventandCommandCanvasTest.javaimportjavax.microedition.lcdui.Display;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassKeyEventandCommandCanvasTestextendsMIDlet{ privateDisplaydisplay; publicKeyEventandCommandCanvasTest(){ super(); } protectedvoidstartApp()throwsMIDletStateChangeException{ display=Display.getDisplay(this); KeyEventandCommandCanvasmc=newKeyEventandCommandCanvas(); display.setCurrent(mc); } protectedvoidpauseApp(){ }protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ }}圖7-22高級事件和低級事件的并發(fā)處理Command命令的處理6高級屏幕與低級屏幕的協(xié)同

一個應(yīng)用程序一般包括多個屏幕,高級屏幕和低級屏幕可以在同一個應(yīng)用程序中協(xié)同工作來完成一個任務(wù)。但在一個特定的屏幕中,只能使用低級界面API(Canvas中)或高級界面API(Screen中)。程序7-21:MyCanvas2.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassMyCanvas2extendsCanvas{ protectedvoidpaint(Graphicsarg0){ System.out.println("paint()方法被調(diào)用...."); System.out.println("isShown()"+isShown()); arg0.setColor(255,255,255); arg0.fillRect(0,0,getWidth(),getHeight()); arg0.setColor(0,0,255); arg0.drawString("程序運行中.....",10,10,Graphics.TOP|Graphics.LEFT); } protectedvoidshowNotify(){ System.out.println("showNotify()方法被調(diào)用...."); System.out.println("isShown()"+isShown()); } protectedvoidhideNotify(){ System.out.println("hideNotify()方法被調(diào)用...."); System.out.println("isShown()"+isShown()); }}程序7-22:AlertandCanvasTest.javaimportjavax.microedition.lcdui.*;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassAlertandCanvasTestextendsMIDletimplementsCommandListener{privateDisplaydisplay;privateCanvascanvas;privateAlertalert; publicAlertandCanvasTest(){ super(); }protectedvoidstartApp()throwsMIDletStateChangeException{display=Display.getDisplay(this);canvas=newMyCanvas2();alert=newAlert("暫停...","稍候回來,廣告也精彩!",null,AlertType.INFO);alert.setTimeout(3000);canvas.addCommand(newCommand("退出",Command.EXIT,1));canvas.addCommand(newCommand("暫停",Command.SCREEN,1));canvas.setCommandListener(this);display.setCurrent(canvas); }protectedvoidpauseApp(){}protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{ }publicvoidcommandAction(Commandc,Displayabled){if(c.getLabel().equals("暫停")){ display.setCurrent(alert,display.getCurrent());}else{ try{ destroyApp(true); notifyDestroyed(); }catch(Exceptione){ }} }}圖7-23顯示低級屏幕圖7-24顯示高級屏幕Alert7屏幕事件處理1屏幕顯示與隱藏事件低級屏幕顯示或隱藏時,將自動觸發(fā)屏幕顯示或隱藏事件,并調(diào)用相應(yīng)的回調(diào)方法。在Canvas對象顯示在屏幕上之前,MIDP實現(xiàn)會首先調(diào)用shownotify()方法。Canvas類中這個方法的默認實現(xiàn)是空的,即不作任何處理。Canvas的子類可以重載這個方法,用來在它被顯示之前執(zhí)行一些任務(wù),比如設(shè)置動畫、啟動計時器等。在Canvas對象被從顯示屏上刪除之后,MIDP實現(xiàn)會立即調(diào)用hideNotify()方法,這個方法的默認實現(xiàn)也是空的,Canvas的子類可以重載這個方法,用來執(zhí)行一些Canvas對象刪除后的工作,比如終止動畫、銷毀計時器等。對于某些突發(fā)事件,比如說來電等等,屏幕會被系統(tǒng)畫面所覆蓋的時候,就會調(diào)用hideNotify()方法,當恢復(fù)原狀時,就會調(diào)用程序開發(fā)人員原本的畫面,那么系統(tǒng)就會同時調(diào)用showNotify()這個方法。程序7-23:MyCanvas2.javaimportjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassMyCanvas2extendsCanvas{protectedvoidpaint(Graphicsarg0){ System.out.println("paint()方法被調(diào)用...."); //System.out.println("isShown()"+isShown()); arg0.setColor(255,255,255); arg0.fillRect(0,0,getWidth(),getHeight()); arg0.setColor(0,0,255); arg0.drawString("程序運行中.....",10,10,Graphics.TOP|Graphics.LEFT); } protectedvoidshowNotify(){ System.out.println("showNotify()方法被調(diào)用....");//System.out.println(this.getClass().getName()); //System.out.println("isShown()"+isShown()); } protectedvoidhideNotify(){ System.out.println("hideNotify()方法被調(diào)用...."); //System.out.println("isShown()"+isShown()); }}程序7-24:CanvasTest2.javaimportjavax.microedition.lcdui.Display;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassCanvasTest2extendsMIDlet{ MyCanvas2mc=newMyCanvas2(); privateDisplaydisplay; publicCanvasTest2(){ super(); }protectedvoidstartApp()throwsMIDletStateChangeException{ display=Display.getDisplay(this); display.setCurrent(mc); }protectedvoidpauseA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論