<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          classDoubleBufferdCanvasextendsCanvas{

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

          /**

          *表示canvas之前所運(yùn)行的方法

          */

          protectedvoidshowNotify(){

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

          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);//描畫圓

          //將offscreenimage導(dǎo)入畫面

          if(!isDoubleBuffered()){

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

          bg=null;

          }

          }

          }

          ex.6

          應(yīng)用

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

          那么,現(xiàn)在我們就作為示范使用應(yīng)用吧。在本講中將要的應(yīng)用程序就是模擬表應(yīng)用程序。利用秒表,描繪出模擬表。在描繪模擬表針時(shí)使用三角函數(shù)。類結(jié)構(gòu)表如下:(表2)

          360截圖20120507112328808.jpg

          Table2

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

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

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

          *秒表任務(wù)

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

          classClockTimerTaskextendsTimerTask{

          privateClockCanvascanvas;

          /**

          *構(gòu)造函數(shù)

          */

          publicClockTimerTask(ClockCanvascanvas){

          this.canvas=canvas;

          }

          /**

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

          */

          publicvoidrun(){

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

          }

          }

          ex.7

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

          /**

          *構(gòu)造函數(shù)

          */

          publicClockCanvas(){

          //設(shè)定秒表

          timer=newTimer();

          timerTask=newClockTimerTask(this);

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

          }

          ex.8

          4-3-3描畫鐘表

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

          Figure4

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

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

          Figure5

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

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

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

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

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

          接下來(lái)描繪秒針。SecondAngle作為秒針的角度,SECOND_LENGTH是秒針的長(zhǎng)度,表的中心坐標(biāo)是(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類的源碼。畫面上有表的中心坐標(biāo)。

          importjava.util.*;

          importjavax.microedition.lcdui.*;



          關(guān)鍵詞: 程序 動(dòng)畫 制作 如何

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();