版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 低級用戶界面編程,郝玉龍 E_mail:,J2ME移動應(yīng)用開發(fā)電子講義,7.1低級用戶界面編程概述 7.2 Graphics繪圖 7.3底層事件處理 7.4高級Command命令處理 7.5高級事件與低級事件的并發(fā) 7.6高級屏幕與低級屏幕的協(xié)同 7.7屏幕事件處理 7.8深入研究屏幕繪制 7.9開發(fā)自定義組件 小結(jié),7.1低級用戶界面編程概述,高級用戶界面API使用起來比較簡單,且具有較高的可移植性,但由于是通過底層的MIDP實現(xiàn)來控制最終的UI顯示,因此無法實現(xiàn)對屏幕UI組件外觀的精確控制。 在一些手機游戲等程序的實現(xiàn)中,要求開發(fā)人員必須對屏幕畫面的每一個細(xì)節(jié)都要進行精確控制,這就
2、需要用到低級用戶界面API來進行界面開發(fā)。 利用低級用戶界面API,開發(fā)者可以對界面進行更精確的控制,但在獲得更大的靈活性的同時也失去了可移植性。,7.1低級用戶界面編程概述,MIDP為程序開發(fā)人員提供了一組低層API。低層API由Canvas類和一組輔助支撐類(例如圖形、字體和圖像)組成。用戶利用這些低級API可對設(shè)備精確控制,如繪制像素、接收原始的用戶輸入事件等。與高級API相比,開發(fā)人員可以更加靈活地控制屏幕繪制,但同時開發(fā)的復(fù)雜程度也大大提高,并在一定程度上喪失了程序的移植性。,低級用戶界面編程必須使用兩個關(guān)鍵類:Canvas類和Graphics類。 Canvas是個抽象類,代表要繪制
3、的抽象屏幕。為使用低層API建立用戶界面,應(yīng)用程序必須建立Canvas的一個子類,并實現(xiàn)paint()方法。 Graphics類的實例是作為參數(shù)傳遞給paint()的,它提供了設(shè)備繪圖能力的入口,它允許在像素層面直接與顯示設(shè)備交互操作。任何時候系統(tǒng)需要繪制屏幕時,都將調(diào)用Canvas類的paint()方法。 低級用戶界面編程的核心任務(wù)在于在Canvas類的paint()方法中如何利用Graphics對象進行繪圖操作。,任何時候開發(fā)人員都可以用repaint()來產(chǎn)生重繪事件,從而間接調(diào)用Canvas類的paint()方法繪制屏幕。repaint()一共有兩個同名方法,其中一個需要四個參數(shù),分別
4、是起始坐標(biāo)(x,y),還有寬度和高度,另外一個不需要任何參數(shù),它是代表整個屏幕全部重新繪制,顯然,前者的效率較后者要高,實際開發(fā)中也大多數(shù)是用前者而不是后者。 注意:在應(yīng)用程序中永遠不要自行調(diào)用paint()方法,要重畫屏幕或者重畫屏幕中的一部分,應(yīng)當(dāng)使用repaint()方法。,程序71:MyCanvas.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class MyCanvas extends Canvas protected void paint(
5、Graphics g) 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); ,程序72:CanvasTest.java import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDlet
6、StateChangeException; public class CanvasTest extends MIDlet private Display display; public CanvasTest() super(); protected void startApp() throws MIDletStateChangeException display = Display.getDisplay(this); MyCanvas mc=new MyCanvas(); display.setCurrent(mc); protected void pauseApp() protected v
7、oid destroyApp(boolean arg0) throws MIDletStateChangeException ,7.2 Graphics繪圖,7.2.1Graphics繪圖坐標(biāo),7.2.2顏色操作,在繪制任何對象之前,必須首先為Graphics對象指定當(dāng)前顏色,然后就能按照預(yù)先設(shè)定顏色顯示繪制的各種對象。可以使用用如下方法進行顏色設(shè)定。 void setColor(int RGB) void setColor(int red, int green , int blue) void setGrayScale(int value),7.2.3繪圖操作,表71 Graphics常見繪
8、圖操作,7.2.4 繪制幾何圖形,程序74:GraphicsDemo.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class GraphicsDemo extends Canvas protected void paint(Graphics g) g.drawRect(20,30,30,30); g.setColor(0,255,0); g.fillRect(60,60,30,30); g.setColor(255,255,0); g.drawArc(
9、100,100,50,50,0,360); g.fillArc(160,160,50,50,0,270); g.setColor(0 xff0000); g.fillTriangle(10,100,90,160,10,140); ,7.2.5線型,Graphics類中保留了繪制各種圖形時使用的2個式樣的線條類型:DOTTED和SOLID。由于fill方法繪制的是填充圖形而draw方法繪制的是線框圖形,因此draw方法下,線型的指定是有效的,而在fill方法中線型的設(shè)定是無效的。 可以利用以下方法設(shè)定線形: void setStrokeStyle(int style) 其中,若要指定DOTTED
10、時, Graphics類的參數(shù)就是Graphics.DOTTED,指定SOLID時,Graphics類的參數(shù)就是Graphics.SOLID。,程序75:StrokeStyleCanvas.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class StrokeStyleCanvas extends Canvas protected void paint(Graphics g) g.setStrokeStyle(Graphics.SOLID); g.dra
11、wRect(10,10,150,150); g.setStrokeStyle(Graphics.DOTTED); g.drawRect(30,30,120,120); ,7.2.6繪制文本,可以使用以下方法描繪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 d
12、rawSubString(String str,int offset,int length,int x,int y,int anchor),程序76:AnchorCanvas.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class AnchorCanvas extends Canvas protected void paint(Graphics graphics) graphics.drawString(小樓昨夜聽春雨, 100,10, Graphic
13、s.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); graphic
14、s.drawString(明朝深巷賣杏花, 80,100, Graphics.BOTTOM|Graphics.LEFT); graphics.drawString(明朝深巷賣杏花, 160,100, Graphics.BASELINE|Graphics.LEFT); ,7.2.7 使用字體,在應(yīng)用中描繪TEXT時,并不只是默認(rèn)的文字,應(yīng)該也有必要描繪粗體字和下劃線文字吧?底層API中有表示字體的Font類。每個Graphics都有一個Font對象與其關(guān)聯(lián),來表示當(dāng)前指定的字體信息。可以使用以下方法來設(shè)置Graphics的字體: void setFont(Font font) 使用下面的方法來獲
15、取當(dāng)前設(shè)置的字體: static Font getFont(int face,int style,int size) Font中有外觀、風(fēng)格和大小 3個屬性。各屬性的取值范圍如下: 字體大?。篠MALL、MEDIUM、LARGE 字體外觀:PROPORTIONAL、MONOSPACE、SYSTEM 字體風(fēng)格:PLAIN、BOLD、ITALIC、UNDERLINED 當(dāng)開發(fā)人員不對Font進行設(shè)定時,機器會自動從設(shè)備中選擇最合適的 Font屬性。調(diào)用方法setFont(null)即可使字體恢復(fù)到默認(rèn)狀態(tài)。,程序77:FontCanvas.java import javax.microeditio
16、n.lcdui.Canvas; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; public class FontCanvas extends Canvas protected void paint(Graphics g) Font font=Font.getFont(Font.FACE_SYSTEM,F(xiàn)ont.STYLE_ITALIC|Font.STYLE_BOLD, Font.SIZE_LARGE); g.setFont(font); g.drawString(你好!J2ME,1
17、0,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, Font.SIZE_LARGE); g.setFont(font); g.drawString(你好!J2ME,
18、10,90,Graphics.LEFT|Graphics.TOP); g.setFont(null); g.drawString(你好!J2ME,10,130,Graphics.LEFT|Graphics.TOP); ,程序78:FontCanvas2.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; public class FontCanvas2 extends Canvas protecte
19、d void paint(Graphics graphics) String text1 = 你好 ; String text2 = 本章將詳細(xì)介紹如何利用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); Font font = graphics.getFont();
20、 int fontHeight = font.getHeight(); if(font.stringWidth(text2)getWidth()/換行處理 int cWidth=font.substringWidth(text2,0,1); int num=getWidth()/cWidth; graphics.drawSubstring(text2,0,num,0,fontHeight, Graphics.TOP|Graphics.LEFT); graphics.drawSubstring(text2,num,text2.length()-num,0,2*fontHeight, Graphi
21、cs.TOP|Graphics.LEFT); else graphics.drawString(text2, 0, fontHeight, Graphics.TOP|Graphics.LEFT); ,7.2.8繪制圖像,可以調(diào)用Graphics類的以下方法來繪制圖像: void drawImage(Image img, int x, int y, int anchor) 其中,參數(shù)anchor代表定位點屬性,使用方法與7.2.6節(jié)完全一致。 Image分為可變和不可變兩種類型的,不可變的Image是從資源文件、二進制數(shù)據(jù)、RGB數(shù)值及其它Image直接創(chuàng)建的,一旦創(chuàng)建完成,Image就無法再變
22、化。不可變的Image通過Image.createImage(String name) 方法從指定的路徑中讀取需要創(chuàng)建Image所必須的數(shù)據(jù),注意參數(shù)中的字符串必須以“/”打頭,并且包括完整的名稱。 可變的Image以給定的大小創(chuàng)建,它是可以修改的,可變的Image由Image.createImage(int width,int height)方法來創(chuàng)建,需要指定代表寬度的參數(shù)width和代表長度信息的參數(shù)height。,程序79:ImageCanvas.java import javax.microedition.lcdui.*; public class ImageCanvas exten
23、ds Canvas Image img=null; protected void paint(Graphics g) if(img=null)getImage(); g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP); private void getImage() try img=Image.createImage(/butterfly.png); catch(Exception e) e.printStackTrace(); ,MIDP2.0中新增了Alpha混合特性,可以生成含有半透明的像素的圖像,圖像中的每個像素由4個字節(jié)表示,其中第一個字節(jié)
24、用戶表示像素的透明程序,其中0表示完全透明,255表示完全模糊。程序開發(fā)人員可以使用這個特性來對圖片進行一些處理,實現(xiàn)一些特殊效果。,程序710:AlphaCanvas.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; public class AlphaCanvas extends Canvas private Image backgroundImage; private int maskArray; private int maskArray1; pri
25、vate int maskArray2; private int imageWidth; private int imageHeight; private int x; private int y; private int maskHeight = 0; public AlphaCanvas(String imageName) try backgroundImage = Image.createImage(imageName); catch(IOException ioe) ioe.printStackTrace() ; imageWidth = backgroundImage.getWidt
26、h(); imageHeight = backgroundImage.getHeight(); /計算掩碼圖像的高度 maskHeight=imageHeight/3; maskArray = new intimageWidth*maskHeight; maskArray1 = new intimageWidth*maskHeight; maskArray2 = new intimageWidth*maskHeight; for (int i = 0; i imageWidth*maskHeight; i+) maskArrayi = 0 xff00FF00;/全模糊掩碼 maskArray1
27、i = 0 x7f00FF00;/半透明掩碼 maskArray2i = 0 x0000FF00;/全透明掩碼 x = (getWidth() - imageWidth)/2; y = (getHeight() - imageHeight)/2; public void paint(Graphics g) g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight(); g.drawImage(backgroundImage, x, y, Graphics.TOP|Graphics.LEFT); g.drawRGB(mas
28、kArray, 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); ,程序711:AlphaBlending.java import javax.microedition.midlet.*; import
29、 javax.microedition.lcdui.*; public class AlphaBlending extends MIDlet private Display display; private AlphaCanvas alphaCanvas; private static final String IMAGE_NAME = /butterfly.png; public AlphaBlending() display = Display.getDisplay(this); alphaCanvas = new AlphaCanvas(IMAGE_NAME); public void
30、startApp() display.setCurrent(alphaCanvas); public void pauseApp() public void destroyApp(boolean unconditional) ,7.3底層事件處理,7.3.1檢測底層事件支持特性 盡管通過Graphics對象可以實現(xiàn)繪制復(fù)雜的用戶交互界面,但是,還必須存在一種底層機制來支持UI界面和用戶之間的交互。Canvas為程序開發(fā)人員提供底層事件處理支持。底層事件大致可分為三類:Press Events(按鍵事件)、Action Keys(動作按鍵)和PointerEvents(觸控事件)。但設(shè)備具體支持
31、那些系統(tǒng)事件,必須由硬件的支持程度來判斷。Canvas提供了一系列的方法供偵測硬件的支持程度。,表72 Canvas底層事件支持說明,7.3.2 按鍵事件的處理,按鍵事件主要用來監(jiān)控用戶對于移動設(shè)備鍵盤的操作,按鍵事件處理主要包括以下幾個核心方法為:keyPressed()、keyReleased()和keyRepeated()。 當(dāng)按鍵按下時會觸發(fā)keyPressed(); 當(dāng)松開按鍵時,會觸發(fā)keyReleased(); 當(dāng)長時間按住按鍵時會觸發(fā)keyRepeated(),但是RepeatEvents不是JTWI要求強制支持的,所以程序開發(fā)人員使用之前一定要調(diào)用hasRepeatEvent
32、s()方法來進行測試,看設(shè)備是否支持。,表73 鍵值屬性信息,7.3.3 游戲動作處理,gameAction是一種將手機鍵盤映射成為游戲動作的機制,通過這種機制,可以使不同手機上的按鍵都能轉(zhuǎn)換為類似或者是相同的游戲動作,這樣更方便用戶對于游戲的操縱。游戲程序的開發(fā)人員根據(jù)游戲動作來設(shè)計游戲也大大提高游戲的可移植性。至于具體哪個鍵對應(yīng)哪個游戲動作是由不同的MIDP實現(xiàn)來完成這一映射的,不同的手機廠商和設(shè)備可能具有不同的MIDP實現(xiàn)??梢栽诔绦蛑型ㄟ^以下代碼來獲取特定的游戲動作對應(yīng)的按鍵: int action = getGameAction(keyCode); 其中,MIDP中定義的游戲動作有:
33、Canvas.UP、Canvas.DOWN、Canvas.LEFT、Canvas.RIGHT、Canvas.FIRE、Game_A、Game_B、Game_C、Game_D。,程序715:GameActionCanvas.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Ticker; public class GameActionCanvas extends Canvas String promote=;
34、int cx,cy; public GameActionCanvas() super(); cx=getWidth()/2; cy=getHeight()/2; public void paint(Graphics g) 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); pro
35、tected void keyPressed(int keycode) if(keycode=getKeyCode(Canvas.UP) if(cy20)cy-=20; if(keycode=getKeyCode(Canvas.DOWN) if(cy20)cx-=20; if(keycode=getKeyCode(Canvas.RIGHT) if(cxthis.getWidth()-20)cx+=20; promote=getKeyValue(keycode); repaint() ; protected void keyReleased(int keycode) public String
36、getKeyValue(int keycode) String nKey=非數(shù)字鍵; String Action=未知游戲動作; 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ù)字鍵
37、 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=鍵 # ; / int temp=getGameAction(keycode); switch(getGameAction(ke
38、ycode) case Canvas.UP: Action=游戲動作 向上 ;break; case Canvas.DOWN: Action=游戲動作 向下 ;break; case Canvas.LEFT: Action=游戲動作 向左 ;break; case Canvas.RIGHT: Action=游戲動作 向右 ;break; case Canvas.FIRE: Action=游戲動作 執(zhí)行 ;break; case Canvas.GAME_A: Action=游戲動作 A ;break; case Canvas.GAME_B: Action=游戲動作 B ;break; case
39、Canvas.GAME_C: Action=游戲動作 C ;break; case Canvas.GAME_D: Action=游戲動作 D ;break; return 您執(zhí)行了+Action+,它對應(yīng)+nKey; ,7.3.4 觸控事件的處理,觸控事件主要面向具備觸控屏幕的高端設(shè)備,并非JTWI要求強制支持的,觸控事件處理的核心方法為:pointerPressed()、pointerReleased()和pointerDragged(),分別對應(yīng)程序開發(fā)人員通常所用的移動設(shè)備手寫筆的點,擊,拖拽幾個動作,程序開發(fā)人員在這三個方法里可以定義相應(yīng)的事件處理函數(shù)。,程序716:PointerEv
40、entCanvas.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class PointerEventCanvas extends Canvas int start_x=0; int start_y=0; int end_x=0; int end_y=0; protected void paint(Graphics g) g.setColor(0 xffffff); g.fillRect(0,0,this.getWidth(),this.getHeigh
41、t(); g.setColor(0 xff0000); g.drawLine(start_x,start_y,end_x,end_y); protected void pointerPressed(int x,int y) start_x=x; start_y=y; repaint(); System.out.println(x); System.out.println(y); protected void pointerReleased(int x,int y) end_y=y; end_x=x; protected void pointerDragged(int x,int y) end_
42、x=x; end_y=y; repaint(); ,7.4高級Command命令處理,在底層API用戶界面開發(fā)中仍舊可以使用高級Command命令處理機制。,程序717:BackgroudCanvas.java import javax.microedition.lcdui.*; public class BackgroudCanvas extends Canvas implements CommandListener private Command Red=new Command(紅,Command.ITEM,1); private Command Green=new Command(綠,C
43、ommand.ITEM,1); private Command Blue=new Command(藍,Command.ITEM,1); int background=0; public BackgroudCanvas() this.addCommand(Red); this.addCommand(Green); this.addCommand(Blue); this.setCommandListener(this); protected void paint(Graphics g) g.setColor(background); g.fillRect(0,0,getWidth(),getHei
44、ght(); public void commandAction(Command c, Displayable d) if(c.equals(Red)background=0 xff0000; else if(c.equals(Green)background=0 x00ff00; else if(c.equals(Blue)background=0 x0000ff; ,程序718:TestCommand.java import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import j
45、avax.microedition.midlet.MIDletStateChangeException; public class TestCommand extends MIDlet private Display s=null; public TestCommand() super(); protected void startApp() throws MIDletStateChangeException s=Display.getDisplay(this); BackgroudCanvas b=new BackgroudCanvas(); s.setCurrent(b); protect
46、ed void pauseApp() protected void destroyApp(boolean arg0) throws MIDletStateChangeException ,7.5高級事件與低級事件的并發(fā),若高級事件和低級事件同時發(fā)生,系統(tǒng)將自動進行判斷。如果按鍵是屬于系統(tǒng)功能按鈕,就會交給高級事件處理函數(shù)來處理,否則才會轉(zhuǎn)由低級事件來處理。有一點必須牢記:對于同一個事件,高級事件處理和低級事件處理不會依次發(fā)生,也就是說,同一個事件不會被處理兩次。,程序719:KeyEventandCommandCanvas.java import javax.microedition.lcdu
47、i.*; public class KeyEventandCommandCanvas extends Canvas implements CommandListener private String promote=; public KeyEventandCommandCanvas() addCommand(new Command(測試,Command.OK,1) ; addCommand(new Command(退出,Command.EXIT,1) ; setCommandListener(this); protected void paint(Graphics g) g.setColor(
48、125,125,125); g.fillRect(0,0,getWidth(),getHeight(); g.setColor(0,0,255); g.drawString(promote,10,10,Graphics.TOP|Graphics.LEFT); public void commandAction(Command c,Displayable s) promote=高級命令處理函數(shù)被調(diào)用; repaint(); protected void keyPressed(int keycode) promote=低級事件處理函數(shù)被調(diào)用; repaint() ; protected void
49、keyReleased(int keycode) promote=低級事件處理函數(shù)被調(diào)用; repaint() ; ,程序720:KeyEventandCommandCanvasTest.java import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class KeyEventandCommandCanvasTest extends MIDlet p
50、rivate Display display; public KeyEventandCommandCanvasTest() super(); protected void startApp() throws MIDletStateChangeException display = Display.getDisplay(this); KeyEventandCommandCanvas mc=new KeyEventandCommandCanvas(); display.setCurrent(mc); protected void pauseApp() protected void destroyA
51、pp(boolean arg0) throws MIDletStateChangeException ,7.6高級屏幕與低級屏幕的協(xié)同,一個應(yīng)用程序一般包括多個屏幕,高級屏幕和低級屏幕可以在同一個應(yīng)用程序中協(xié)同工作來完成一個任務(wù)。但在一個特定的屏幕中,只能使用低級界面API(Canvas中)或高級界面API(Screen中)。,程序721:MyCanvas2.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class MyCanvas2 extends C
52、anvas protected void paint(Graphics arg0) 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); protected void showNotify() S
53、ystem.out.println(showNotify()方法被調(diào)用.); System.out.println(isShown() + isShown(); protected void hideNotify() System.out.println(hideNotify()方法被調(diào)用.); System.out.println(isShown() + isShown(); ,程序722:AlertandCanvasTest.java import javax.microedition.lcdui.*; import javax.microedition.midlet.MIDlet; im
54、port javax.microedition.midlet.MIDletStateChangeException; public class AlertandCanvasTest extends MIDlet implements CommandListener private Display display; private Canvas canvas; private Alert alert; public AlertandCanvasTest() super(); protected void startApp() throws MIDletStateChangeException d
55、isplay=Display.getDisplay(this); canvas=new MyCanvas2(); alert=new Alert(暫停.,稍候回來,廣告也精彩!,null,AlertType.INFO); alert.setTimeout(3000); canvas.addCommand(new Command(退出,Command.EXIT,1); canvas.addCommand(new Command(暫停,Command.SCREEN,1); canvas.setCommandListener(this); display.setCurrent(canvas); pr
56、otected void pauseApp() protected void destroyApp(boolean arg0) throws MIDletStateChangeException public void commandAction(Command c, Displayable d) if(c.getLabel().equals(暫停) display.setCurrent(alert,display.getCurrent(); else try destroyApp(true); notifyDestroyed(); catch(Exception e) ,7.7屏幕事件處理,
57、7.7.1 屏幕顯示與隱藏事件 低級屏幕顯示或隱藏時,將自動觸發(fā)屏幕顯示或隱藏事件,并調(diào)用相應(yīng)的回調(diào)方法。在Canvas對象顯示在屏幕上之前,MIDP實現(xiàn)會首先調(diào)用shownotify()方法。Canvas類中這個方法的默認(rèn)實現(xiàn)是空的,即不作任何處理。Canvas的子類可以重載這個方法,用來在它被顯示之前執(zhí)行一些任務(wù),比如設(shè)置動畫、啟動計時器等。 在Canvas對象被從顯示屏上刪除之后,MIDP實現(xiàn)會立即調(diào)用hideNotify()方法,這個方法的默認(rèn)實現(xiàn)也是空的,Canvas的子類可以重載這個方法,用來執(zhí)行一些Canvas對象刪除后的工作,比如終止動畫、銷毀計時器等。 對于某些突發(fā)事件,比如
58、說來電等等,屏幕會被系統(tǒng)畫面所覆蓋的時候,就會調(diào)用hideNotify()方法,當(dāng)恢復(fù)原狀時,就會調(diào)用程序開發(fā)人員原本的畫面,那么系統(tǒng)就會同時調(diào)用showNotify()這個方法。,程序723:MyCanvas2.java import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class MyCanvas2 extends Canvas protected void paint(Graphics arg0) System.out.println(paint()方法被調(diào)用.
59、); /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); protected void showNotify() System.out.println(showNotify()方法被調(diào)用.); / System.out.println(this.getClass().getName(); /System.out.println(isShown() + isShown();
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院醫(yī)??颇甓裙ぷ骺偨Y(jié)
- 退役軍人服務(wù)保障體系標(biāo)準(zhǔn)化建設(shè)
- 求職者面試技巧全套教程
- 一般工貿(mào)行業(yè)新員工三級安全培訓(xùn)考試試題及答案
- 建設(shè)工程施工合同糾紛要素式起訴狀模板修改無約束
- 不用熬夜寫!建設(shè)工程施工合同糾紛要素式起訴狀模板現(xiàn)成用
- 保險講師培訓(xùn)
- 環(huán)境友好催化技術(shù)課件
- 調(diào)色年終總結(jié)和配料(3篇)
- 公務(wù)員法執(zhí)行情況自查報告
- 枕骨骨折的護理課件
- TCEC電力行業(yè)數(shù)據(jù)分類分級規(guī)范-2024
- 駱駝的養(yǎng)殖技術(shù)與常見病防治
- GB/T 26951-2025焊縫無損檢測磁粉檢測
- 2025及未來5-10年高壓管匯項目投資價值市場數(shù)據(jù)分析報告
- 《國家十五五規(guī)劃綱要》全文
- 腹部手術(shù)圍手術(shù)期疼痛管理指南(2025版)課件
- 2025年衛(wèi)生人才評價考試(臨床醫(yī)學(xué)工程技術(shù)中級)歷年參考題庫含答案
- 呼吸康復(fù)科普脫口秀
- 2025年《思想道德與法治》期末考試題庫及答案
- 2025初一英語閱讀理解100篇
評論
0/150
提交評論