<noscript id="eassg"><table id="eassg"></table></noscript>
  • <strike id="eassg"><s id="eassg"></s></strike>
  • <ul id="eassg"></ul>
    注冊|登錄

    聯(lián)系電話:024-31891684  13390130939
    沈陽軟件公司--沈陽軟件定制

    沈陽軟件開發(fā)_沈陽軟件公司_沈陽軟件定制/軟件/最新技術(shù)

    Latest technology最新技術(shù)

    HTML5 Canvas動畫設(shè)計解析

    瀏覽量:3032

    HTML5 Canvas動畫設(shè)計解析

    我們使用JavaScript操控canvas元素可以很容易做出可互動的動畫。但是當(dāng)初canvas元素并不是為此而設(shè)計的(與Flash不同),因此存在一些限制。

    其中最大的限制就是Canvas元素中的圖形一經(jīng)繪制就不會改變,除非你要人為改變它。如果我們需要改變Canvas元素中繪制的圖形,我們就必須先重繪相應(yīng)的圖形。重繪復(fù)雜的圖形會花費(fèi)掉很多的時間,因此動畫效果也將受限于電腦的速度。

    實現(xiàn)動畫的原理

    1、重繪canvas

    除非你會畫一些能夠填滿整個canvas的圖形(例如背景圖),否則你有必要清除先前繪制的所有圖形。而最簡單的方法是使用clearRect方法。

    2、保存canvas狀態(tài)

    如果你更動了任何一個會影響到canvas狀態(tài)的設(shè)定(樣式、變形等等),并且希望能夠確保每一次繪制畫格時都是原本的狀態(tài),你就需要保存canvas狀態(tài)。

    3、繪制移動中的圖形

    在這一步驟里才真正畫出需要移動的圖形。

    4、讀取canvas狀態(tài)

    如果你先前保存過Canvas的狀態(tài),就先在畫新的圖形之前讀取之前的狀態(tài)。

    動畫的操控

     

    2012-5-16 09:43:57 上傳

     


    圖形是以直接使用canvas方法或調(diào)用自訂的函數(shù)所繪制的。在正常情況下,當(dāng)JavaScript執(zhí)行完成時,我們就能看見呈現(xiàn)在canvas上的結(jié)果。

    我們需要一個方法,能在一段時間內(nèi)循環(huán)執(zhí)行我們的繪圖函數(shù)。有兩個方法可操控這樣的動畫。首先,這里有setInterval和setTimeout函數(shù),可用來在指定的時間內(nèi)調(diào)用特定的函數(shù)。

    1. setInterval(animateShape,500);
    2. setTimeout(animateShape,500);

    復(fù)制代碼



    如果你不需要和用戶互動,就最好使用setInterval函數(shù),他會重復(fù)執(zhí)行預(yù)先準(zhǔn)備好的代碼。在上面的例子里,animateShape函數(shù)是每500毫秒(一秒的一半)執(zhí)行一次。setTimeout函數(shù)只會在設(shè)定好的時間點(diǎn)上執(zhí)行一次。
    第二個方法是我們可以利用用戶的輸入來操控。如果我們想要制作游戲,我們可以使用鍵盤或滑鼠的事件來操控動畫。只需設(shè)定事件接收器(eventListener),我們就能捕捉任何的使用者動作,并執(zhí)行我們的動畫函數(shù)。
    動畫范例
    在這個范例中,我們使用setInterval函數(shù)來操控動畫,使小型的太陽系模擬系統(tǒng)動起來。

    1. var sun = new Image();
    2. var moon = new Image();
    3. var earth = new Image();
    4. function init(){
    5. sun.src = 'images/sun.png';
    6. moon.src = 'images/moon.png';
    7. earth.src = 'images/earth.png';
    8. setInterval(draw,100);
    9. }
    10.  
    11. function draw() {
    12. var ctx = document.getElementById('canvas').getContext('2d');
    13.  
    14. ctx.globalCompositeOperation = 'destination-over';
    15. ctx.clearRect(0,0,300,300); // 清除canvas
    16.  
    17. ctx.fillStyle = 'rgba(0,0,0,0.4)';
    18. ctx.strokeStyle = 'rgba(0,153,255,0.4)';
    19. ctx.save();
    20. ctx.translate(150,150);
    21.  
    22. // 地球
    23. var time = new Date();
    24. ctx.rotate( ((2*Math.PI)/60)*time.getSeconds() +
    25. ((2*Math.PI)/60000)*time.getMilliseconds() );
    26. ctx.translate(105,0);
    27. ctx.fillRect(0,-12,50,24); // 陰影
    28. ctx.drawImage(earth,-12,-12);
    29.  
    30. // 月球
    31. ctx.save();
    32. ctx.rotate( ((2*Math.PI)/6)*time.getSeconds() +
    33. ((2*Math.PI)/6000)*time.getMilliseconds() );
    34. ctx.translate(0,28.5);
    35. ctx.drawImage(moon,-3.5,-3.5);
    36. ctx.restore();
    37.  
    38. ctx.restore();
    39.  
    40. ctx.beginPath();
    41. ctx.arc(150,150,105,0,Math.PI*2,false); // 地球軌道
    42. ctx.stroke();
    43.  
    44. ctx.drawImage(sun,0,0,300,300);
    45. }

    沈陽團(tuán)購網(wǎng)|營口網(wǎng)站制作|沈陽軟件公司|軟件定制|網(wǎng)站建設(shè)|加盟易勢|提交問題

    国产日韩久久久精品影院首页| 在线精品国精品国产尤物| 综合91在线精品| 亚洲一区爱区精品无码| 国产精品国产三级国产AⅤ| 精品日韩一区二区| 国产69精品久久久久999三级| 成人无号精品一区二区三区 | 国产成人精品日本亚洲语音| 精品成人A区在线观看| 久久精品国产亚洲AV无码偷窥| 久久精品国产亚洲AV果冻传媒| 国产一区二区精品久久凹凸| 国产精品麻豆VA在线播放| 香港aa三级久久三级老师2021国产三级精品三级在 | 亚洲日韩精品无码一区二区三区 | 精品久久久无码中文字幕天天| 免费看一级毛片在线观看精品视频| 日韩一区二区三区免费播放| 国产精品久久久久久久久99热 | 亚洲AV蜜桃永久无码精品| 日韩制服丝袜在线观看| 精品福利一区3d动漫| 拍国产乱人伦偷精品视频 | 国产精品视频一区二区三区无码| 中文精品人人永久免费| 精品人妻少妇一区二区三区在线 | 亚洲国产成人精品无码区花野真一| 国产精品手机在线| 国产成人精品1024在线| 99精品一区二区三区无码吞精| 精品国产乱码久久久久久呢| 精品日产卡一卡二卡国色天香| 69国产成人精品午夜福中文| 亚洲精品视频专区| 久久精品国产亚洲AV蜜臀色欲| 亚洲国产精品美女| 精品人妻AV一区二区三区| 亚洲国产精品一区二区久| 国产精品嫩草影院一二三区入口 | 国产日韩高清三级精品人成|