如何制作動(dòng)畫(huà)程序
■前言
本文引用地址:http://dyxdggzs.com/article/149130.htm在前一講中我們講述了如何利用低級API制作圖表應用程序的方法。如果僅僅是圖表內容的表示,那么在WEB上就可以用靜止的頁(yè)面表示。但是在手機應用程序中表示的話(huà),就能讓圖表內容具有動(dòng)感。這就是應用程序與WEB的區別,這也正是其優(yōu)點(diǎn)所在。在本講中我們將進(jìn)一步講述如何在手機應用程序中制作動(dòng)畫(huà),并詳細介紹其具體操作方法。
■4-1動(dòng)畫(huà)
基本上,動(dòng)畫(huà)能夠表現出文字、圖形、圖片等的描繪位置和畫(huà)面自身的連續變化。目前的程序中,按下按鍵,就會(huì )實(shí)行既定的方法。直到實(shí)行完既定方法之后才能進(jìn)行其他方法操作。但是,表示動(dòng)畫(huà)過(guò)程中,不實(shí)行動(dòng)畫(huà)表示以外的方法就沒(méi)有什么意義,因此應該有必要在表示動(dòng)畫(huà)的同時(shí)也可以實(shí)行其他的方法。所以掌握線(xiàn)程和計時(shí)器技術(shù)的知識和應用是必不可少的。接下來(lái),我們將詳細介紹線(xiàn)程和計時(shí)器。
■4-1-1線(xiàn)程
線(xiàn)程是執行程序的最小單位,用來(lái)執行Standalone的Java應用程序的main()方法。當你需要同步執行多個(gè)操作,可以用多線(xiàn)程并發(fā)執行。使用這種線(xiàn)程的程序被稱(chēng)為“多線(xiàn)程程序”。
■4-1-1-1線(xiàn)程的使用
首先我們盡快學(xué)習怎樣使用“線(xiàn)程”。有兩種方法能使用線(xiàn)程:Runnable接口的使用方法和Thread類(lèi)的繼承類(lèi)的定義方法。在此,我們使用前一個(gè)方法—實(shí)現Runnable接口的方法。
實(shí)現Runnable接口的類(lèi)必須要覆蓋run()方法。覆蓋的run()方法中記述了用線(xiàn)程執行的處理。(ex.1)
classTestCanvasextendsCanvasimplementsRunnable{
/**
*線(xiàn)程執行的處理
**/
publicvoidrun(){
//記述處理
.
.
}
/**
*描繪方法
**/
publicvoidpaint(Graphicsg){
//描繪處理
.
.
}
}
ex.1
另外一種方法是使用線(xiàn)程類(lèi)Thread。如下所示:用構造函數傳遞一個(gè)參數到該類(lèi)的實(shí)例,該參數是實(shí)現Runnable接口的。使用start()方法就啟動(dòng)該線(xiàn)程了。(ex.2)
Runnablerunnable=newTestCanvas();//實(shí)現Runnable類(lèi)
Threadthread=newThread(runnable);
thread.start();
ex.2
■4-1-1-2制作簡(jiǎn)單的動(dòng)畫(huà)
接著(zhù)我們來(lái)看線(xiàn)程如何被用于制作簡(jiǎn)單的動(dòng)畫(huà)。在下面的實(shí)例中,球從左向右運動(dòng)。(ex.3)
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
/**
*球飛出去的實(shí)例動(dòng)畫(huà)
*/
publicclassMovingBallextendsMIDlet{
privateDisplaydisplay;
privateMovingBallCanvascanvas;
/**
*構造函數
*/
publicMovingBall(){
display=Display.getDisplay(this);
canvas=newMovingBallCanvas();
}
/**
*運行時(shí)的處理
*/
protectedvoidstartApp()throwsMIDletStateChangeException{
display.setCurrent(canvas);
}
protectedvoidpauseApp(){}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
}
importjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;
/**
*球飛出去的實(shí)例動(dòng)畫(huà)的canvas。
*/
publicclassMovingBallCanvasextendsCanvasimplementsRunnable{
privateintx;//球的X坐標
/**
*構造函數
*/
publicMovingBallCanvas(){
Threadth=newThread(this);
th.start();
}
/**
*線(xiàn)程運行的處理
*/
publicvoidrun(){
while(true){
x+=3;//更改球的坐標
repaint();//再次描繪
try{
Thread.sleep(100);//100毫秒待機
}catch(InterruptedExceptione){
}
}
}
/**
*描繪方法
*/
protectedvoidpaint(Graphicsg){
//清除畫(huà)面
g.setColor(255,255,255);//白色
g.fillRect(0,0,getWidth(),getHeight());
//表示球
g.setColor(255,0,0);
g.fillArc(x,50,20,20,0,360);
}
}
Figure1
■4-1-1-3線(xiàn)程的待機處理
■4-1-1-3線(xiàn)程的待機處理
我們看看run()是如何支持等待機制的。如果沒(méi)有任何等待,球會(huì )迅速從左向右飛而我們無(wú)法察覺(jué)。為此,執行Thread中的靜態(tài)方法sleep。在其參數中指定等待時(shí)間(單位毫秒)。(ex.4)


Figure1
■
4-1-1
-3線(xiàn)程的待機處理
我們看看run()是如何支持等待機制的。如果沒(méi)有任何等待,球會(huì )迅速從左向右飛而我們無(wú)法察覺(jué)。為此,執行Thread中的靜態(tài)方法sleep。在其參數中指定等待時(shí)間(單位毫秒)。(ex.4)
Thread.sleep(100);//100毫秒待機
ex.4
如此例所示,處理和處理之間能夠待機100毫秒,按另外觀(guān)點(diǎn)看,與在100毫秒的定期間隔下運行處理是一樣的。定期間隔下的處理,使用名為T(mén)imer的類(lèi)同樣能夠實(shí)現。下面說(shuō)明一下Timer。
■4-1-2Timer
JAVA提供了計時(shí)器功能,它能有規則地、重復地執行或者在指定時(shí)間里執行。線(xiàn)程的運算可以是連續的,而不僅僅是按規則的進(jìn)度。計時(shí)器的便利在于系統已經(jīng)為你準備好特定的方法用于在指定時(shí)間或定時(shí)執行。
■4-1-2-1時(shí)間的使用
Timer類(lèi)和TimerTask類(lèi)能夠實(shí)現計時(shí)器的功能。
實(shí)例化一個(gè)TIMER的類(lèi),再調用一個(gè)繼承了TIMERTASK的類(lèi)做SCHEDULE。這樣,TimerTask子類(lèi)的run()就會(huì )在指定時(shí)間或周期被Timer實(shí)例呼叫。(表1)
評論