如何制作動(dòng)畫(huà)程序
Table1
Timer
在Timer類中主要使用下面的方法。
•voidschedule(TimerTasktask,Datedate)
•voidschedule(TimerTasktask,Datedate,longperiod)
•voidschedule(TimerTasktask,longdelay)
•voidschedule(TimerTasktask,longdelay,longperiod)
•voidcancel()
這些schedule方法用于設(shè)定任務(wù)及何時(shí)執(zhí)行。若不設(shè)定第三個(gè)自變量period,在第二個(gè)自變量所指定的時(shí)間任務(wù)只執(zhí)行一次。否則第二個(gè)自變量所指定的時(shí)間之后,任務(wù)會(huì)反復(fù)執(zhí)行,自變量period是反復(fù)執(zhí)行時(shí)的延時(shí)。另外,呼叫出cancel方法,則會(huì)結(jié)束計(jì)時(shí)器程序。
TimerTask
TimerTask是抽象類。需要定義其子類。在所繼承的類中必須重載抽象方法run(),必須根據(jù)計(jì)時(shí)器的schedule定義具體的操作。
在TimerTask類中主要使用如下的方法。
•abstractvoidrun()
•voidcancel()
按照Timer類中所設(shè)定的schedule執(zhí)行run()方法。用cancel()方法能夠結(jié)束任務(wù)。
現(xiàn)在來(lái)看看用線程實(shí)現(xiàn)的圓球運(yùn)動(dòng)的動(dòng)畫(huà)--在這里我們也可以使用計(jì)時(shí)器來(lái)實(shí)現(xiàn)。如下所示:(ex.5)
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.*;
/**
*球飛出去的動(dòng)畫(huà)實(shí)例計(jì)時(shí)器版
*/
publicclassTimerMovingBallextendsMIDlet{
privateDisplaydisplay;
privateTimerMovingBallCanvascanvas;
/**
*構(gòu)造函數(shù)
*/
publicTimerMovingBall(){
display=Display.getDisplay(this);
canvas=newTimerMovingBallCanvas();
}
/**
*運(yùn)行時(shí)的處理
*/
protectedvoidstartApp()throwsMIDletStateChangeException{
display.setCurrent(canvas);
}
protectedvoidpauseApp(){}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
}
importjava.util.*;
importjavax.microedition.lcdui.*;
/**
*球飛出去的實(shí)例動(dòng)畫(huà)的canvas。
*/
publicclassTimerMovingBallCanvasextendsCanvas{
privateintx;//球的x坐標(biāo)
privateImageimg;
privateTimertimer;
privateTimerTasktask;
/**
*構(gòu)造函數(shù)
*/
publicTimerMovingBallCanvas(){
//讀取畫(huà)像
try{
img=Image.createImage(/back.PNG);
}catch(Exceptione){
e.printStackTrace();
}
//Timer,TimerTask的設(shè)定
timer=newTimer();
task=newTimerMovingBallTask(this);
timer.schedule(task,100,100);
//從第101毫秒開(kāi)始在每100毫秒運(yùn)行任務(wù)
}
/**
*描繪方法
*/
protectedvoidpaint(Graphicsg){
g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP);
//表示球
g.setColor(255,0,0);
g.drawString(“withTimer”,0,0,Graphics.TOP|Graphics.LEFT);
g.fillArc(x,50,40,40,0,360);
}
/**
*能夠變化球的X坐標(biāo)
*/
publicvoidincrement(){
x+=3;
}
}
/**
*計(jì)時(shí)器任務(wù)根據(jù)計(jì)時(shí)器所設(shè)定的時(shí)間表,運(yùn)行run()方法。
*/
classTimerMovingBallTaskextendsTimerTask{
privateTimerMovingBallCanvascanvas;
/**
*構(gòu)造函數(shù)
*/
publicTimerMovingBallTask(TimerMovingBallCanvascanvas){
this.canvas=canvas;
}
/**
*呼叫計(jì)時(shí)器時(shí)所進(jìn)行的處理
*/
publicvoidrun(){
canvas.increment();
canvas.repaint();
}
}
ex.5
TimerMovingCanvas類的構(gòu)造函數(shù)中進(jìn)行下面的計(jì)時(shí)器設(shè)定。
//Timer,TimerTask的設(shè)定
timer=newTimer();
task=newTimerMovingBallTask(this);
timer.schedule(task,100,100);//從第101毫秒開(kāi)始在每100毫秒運(yùn)行任務(wù)
在TimerMovingBallTask中,從TimerTask繼承的run()被調(diào)用,X坐標(biāo)的遞增使得球運(yùn)動(dòng)起來(lái)。這樣有規(guī)律地使X坐標(biāo)遞增,就使得圓球在畫(huà)面上從左到右移動(dòng)。(圖2)。
publicvoidrun(){
canvas.increment();
canvas.repaint();
}
2
■雙緩沖
一旦進(jìn)行動(dòng)畫(huà)就要頻繁地反復(fù)操作描繪處理,畫(huà)面處理中可能會(huì)突然發(fā)生屏幕閃爍。為了能夠控制屏幕的閃爍,一般會(huì)使用雙緩沖的手法。用雙緩沖存儲(chǔ)器并不是直接在畫(huà)面上進(jìn)行描繪,而是在被稱為屏幕外畫(huà)像的虛擬畫(huà)像上描繪全部之后,由于是表示畫(huà)面,所以能控制屏幕的閃爍。(圖3)
Figure3
根據(jù)手機(jī)機(jī)種的不同,事先將Canvas類與雙緩沖存儲(chǔ)器相對(duì)應(yīng)的情況也是有的。換言之,即使實(shí)現(xiàn)方?jīng)]有明確地定義雙緩沖存儲(chǔ)器,則在用雙緩沖存儲(chǔ)器的機(jī)制進(jìn)行描繪的情況下,沒(méi)必要特別關(guān)心閃爍的解決方案,但是要在不同的機(jī)型上運(yùn)行。N800的機(jī)型已經(jīng)能適應(yīng)此雙緩沖存儲(chǔ)器。為此,開(kāi)發(fā)N800應(yīng)用程序的時(shí)候,有時(shí)會(huì)有必要在這闡述雙緩沖存儲(chǔ)器的處理。此時(shí),應(yīng)該知道終端是否適應(yīng)雙緩沖存儲(chǔ)器、以及是否有必要分開(kāi)處理。
評(píng)論