canvas實現點連線動畫


給定一系列坐標(x, y)點, 實現將各個點按照先后順序連接起來的動畫。還有兩個要求:

1.點與點之間直接用線段連接, 不用考慮曲線

2.動畫支持暫停, 繼續, 重頭開始播放功能

這個功能該怎么實現呢,我們首先會想到HTML5點新功能canvas。廢話少說直接上實現代碼

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>題2</title>
 6     <style type="text/css">
 7         textarea{
 8             height: 100px;
 9         }
10         .btns{
11             margin: 10px;
12         }
13         button{
14             width: 80px;
15         }
16     </style>
17 </head>
18 <body>
19     <canvas id="canvas" width="500" height="500"></canvas>
20     <div>
21         <label>坐標</label><textarea id="dots" type='text'></textarea>
22         <button id='change'>修改</button>
23     </div>
24     <br/>
25     <div class="btns">
26         <button id='start'>開始</button>
27         <button id='stop'>暫停</button>
28         <button id='continue'>繼續</button>
29     </div>
30     <script>
31         //獲取指定的canvas元素
32         var canvas = document.getElementById('canvas');
33         //調用canvas元素的getContext 方法訪問獲取2d渲染的上下文
34         var context = canvas.getContext('2d');
35         var dotarr = [{"x":280,"y":200},{"x":180,"y":150},{"x":100,"y":250},{"x":280,"y":300},{"x":180,"y":400},
36 {"x":80,"y":350}];
37         var isStop = false;
38         document.getElementById('dots').value=JSON.stringify(dotarr);
39         function drawline(dots){
40             for(var i in dots){
41                 //context.clearRect(0, 0, canvas.width, canvas.height)
42                 //window.requestAnimationFrame(drawline,canvas);
43                 var dot=dots[i];
44                 var todot=dots[i];
45                 var time='';
46                 localStorage.setItem('length',dots.length);
47                 if((parseInt(i)+1)<dots.length){
48                     todot=dots[parseInt(i)+1];
49                 }
50                 (function(dot,todot,time,i){
51                     time=setTimeout(function(){
52                         //context.clearRect(0, 0, canvas.width, canvas.height)
53                         context.beginPath();
54                         context.moveTo(dot.x,dot.y);
55                         context.lineTo(todot.x,todot.y);
56                         localStorage.setItem('index',i);
57                         localStorage.setItem("t", time);
58                         context.closePath();
59                         context.stroke();
60                     },(parseInt(i)+1)*1000);
61                 })(dot,todot,time,i)      
62             }
63         }
64         document.getElementById("change").onclick=function(){
65             dotarr=JSON.parse(document.getElementById('dots').value);
66         }
67         document.getElementById("start").onclick=function(){
68             context.clearRect(0, 0, canvas.width, canvas.height);
69             var t=parseInt(localStorage.getItem("t"));
70             var length=parseInt(localStorage.getItem('length'));
71             isStop=true;
72             for(var i=t;i<=(t+length);i++){
73                 clearTimeout(i);
74             }
75             drawline(dotarr);
76         }
77         document.getElementById("stop").onclick=function(){
78             var t=parseInt(localStorage.getItem("t"));
79             var length=parseInt(localStorage.getItem('length'));
80             isStop=true;
81             for(var i=t;i<=(t+length);i++){
82                 clearTimeout(i);
83             }
84             console.log('暫停');
85             
86         }
87         document.getElementById("continue").onclick=function(){
88             if(isStop){
89                 var index=parseInt(localStorage.getItem('index'));
90                 var newdots=dotarr.slice(index+1);
91                 console.log(newdots);
92                 drawline(newdots);
93                 isStop=false;
94                 console.log('繼續');
95             }
96         }
97     </script>
98 </body>
99 </html>
View Code

效果如下

每次點開始都會重繪整個動畫,點擊暫停和繼續會在控制台打印日志,非暫停狀態下點擊繼續無效。

 

 

 

@原創版權所有,要轉載請注明出處,否則追究版權責任


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM