<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 如何制作動(dòng)畫(huà)程序

如何制作動(dòng)畫(huà)程序

作者: 時(shí)間:2012-05-07 來(lái)源:網(wǎng)絡(luò ) 收藏

使用Canvas類(lèi)的isDoubleBufferd()方法就能知道是否適應雙緩沖存儲器。由于使用這種方法可以區分開(kāi)適應雙緩沖存儲器的情況和不適應適應的情況,因此無(wú)論在什么樣的環(huán)境下都能夠有效控制閃爍現象。示例如下:(ex.6)

classDoubleBufferdCanvasextendsCanvas{

ImageoffImg=null;//關(guān)閉畫(huà)面的圖片

/**

*表示canvas之前所運行的方法

*/

protectedvoidshowNotify(){

if(!isDoubleBuffered()){//關(guān)閉畫(huà)面的圖片

offImg=Image.createImage(getWidth(),getHeight());

}

}

/**

*描繪方法

*/

protectedvoidpaint(Graphicsg){

Graphicsbg=null;

if(offImg!=null){

bg=offImg.getGraphics();

}else{

bg=g;

}

//使用bg描繪

bg.setColor(255,255,255);

bg.fillRect(0,0,getWidth(),getHeight());

bg.setColor(255,0,0);

bg.drawArc(x,y,30,30,0,360);//描畫(huà)圓

//將offscreenimage導入畫(huà)面

if(!isDoubleBuffered()){

g.drawImage(offImg,0,0,Graphics.TOP|Graphics.LEFT);

bg=null;

}

}

}

ex.6

應用

4-3-1時(shí)鐘的應用

那么,現在我們就作為示范使用應用吧。在本講中將要的應用程序就是模擬表應用程序。利用秒表,描繪出模擬表。在描繪模擬表針時(shí)使用三角函數。類(lèi)結構表如下:(表2)

360截圖20120507112328808.jpg

Table2

4-3-2時(shí)間的設定

在模擬表應用程序中秒針一秒動(dòng)一下。因此,使用秒表,要設定每秒不同時(shí)刻的畫(huà)面更新。在ClockCanvas類(lèi)的paint方法內取得時(shí)刻,描繪鐘表。秒表任務(wù)如下所示:(ex.7)

/**********************************************

*秒表任務(wù)

**********************************************/

classClockTimerTaskextendsTimerTask{

privateClockCanvascanvas;

/**

*構造函數

*/

publicClockTimerTask(ClockCanvascanvas){

this.canvas=canvas;

}

/**

*在每個(gè)指定時(shí)間內運行

*/

publicvoidrun(){

canvas.repaint();//再次描繪canvas

}

}

ex.7

定義完秒表任務(wù)后,就要在秒表上設定秒表任務(wù)。用ClockCanvas類(lèi)的構造函數進(jìn)行如下設定。(ex.8)

/**

*構造函數

*/

publicClockCanvas(){

//設定秒表

timer=newTimer();

timerTask=newClockTimerTask(this);

timer.schedule(timerTask,1000,1000);//Onceevery1,000ms

}

ex.8

4-3-3描畫(huà)鐘表

設定完秒表后開(kāi)始描繪鐘表。下面就是鐘表的框架(clock.png)。(圖4)

Figure4

接下來(lái)描畫(huà)秒針。因為要根據時(shí)刻變化秒針的位置,所以有必要根據時(shí)刻計算秒針的位置。在這兒用Graphics類(lèi)的drawLine方法描繪秒針。在表的中心坐標上固定住線(xiàn)的始點(diǎn),從時(shí)刻中計算出線(xiàn)的終點(diǎn)。

使用三角函數計算秒針終點(diǎn)的坐標。表的中心坐標是(x,y)、秒針的長(cháng)度設為1,秒針的角度設為θ,那么終點(diǎn)的坐標就是(x+l*cos(θ),y+l*sin(θ))。(圖5)

Figure5

三角函數的實(shí)際計算,在J2SE中,Math類(lèi)有sin,cos方法,所以通常會(huì )使用這些方法,而J2ME中是沒(méi)有這種方法的。因此,在本講中定義了名為T(mén)rigonometricFunctions的類(lèi),將預先計算好的sin,cos值擴大10000倍排列并保持在這個(gè)類(lèi)中。所謂擴大10000倍,是由于J2ME不支持double和float等小數點(diǎn)型,所以不能原封不動(dòng)地保存小數點(diǎn)sin,cos。因此,用MIDP處理小數時(shí),將小數擴大幾倍變成整數加以保持,實(shí)際上在使用時(shí),用事先乘出的數值再除以所乘的數值,計算并使用由此而得出的實(shí)際值。

然而,在J2ME下處理含有小數的數值時(shí),由于要將小數四舍五入成整數所以就會(huì )產(chǎn)生誤差。例如:0.12341234…四舍五入成整數就是0,這與原來(lái)的0.12341234…是有誤差的。由于要盡量減少誤差,所以計算之前要盡可能的乘以大數值并且有必要保存其整數。例如:在先前的0.12341234…基礎上乘以1000后就變成了123.41234…,小數點(diǎn)以下四舍五入后就是123。將123除以1000后就是0.123。這與開(kāi)始的數值之間的誤差僅為0.00041234…,原封不動(dòng)的將原來(lái)的數值四舍五入后數值0產(chǎn)生的誤差是0.00041234…,二者相比則前者的誤差要小的多??傊?,小數上乘以的數值越大四舍五入后與原來(lái)的數值之間的誤差就越小。

先講sin,cos的數值擴大10000倍,秒針坐標計算的最后在除以10000。N800畫(huà)面尺寸的縱長(cháng)為180,那么進(jìn)行180*x(只有X為小數)計算時(shí)的最大誤差是

0.0000999...*180=0.017999...isapproximately0.0180

總是比1小,沒(méi)有四舍五入的誤差。

接下來(lái)描繪秒針。SecondAngle作為秒針的角度,SECOND_LENGTH是秒針的長(cháng)度,表的中心坐標是(CENTER_X,CENTER_Y)。(ex.9)

intsecondX=CENTER_X+TrigonometricFunctions.COS[secondAngle]*SECOND_LENGTH/10000;

intsecondY=CENTER_Y-TrigonometricFunctions.SIN[secondAngle]*SECOND_LENGTH/10000;

g.drawLine(CENTER_X,CENTER_Y,secondX,secondY);

ex.9

下面是ClockCanvas類(lèi)的源碼。畫(huà)面上有表的中心坐標。

importjava.util.*;

importjavax.microedition.lcdui.*;



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>