第165天:canvas繪制圓環旋轉動畫


canvas繪制圓環旋轉動畫——面向對象版

1、HTML

注意引入Konva.js

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4    <meta charset="UTF-8">
  5    <title>使用Konva繪制圓環旋轉動畫</title>
  6    <script src="konva/konva.min.js"></script>
  7    <script src="CircleText.js"></script>
  8 </head>
  9 <body>
 10 <div id="container">
 11 
 12 </div>
 13 
 14 <script>
 15    //創建舞台
 16    var stage=new Konva.Stage({
 17       container:'container',
 18       width:window.innerWidth,//全屏
 19       height:window.innerHeight
 20 
 21    });
 22 
 23    //創建層
 24 
 25    //中心點坐標
 26    var cenX=stage.width()/2;
 27    var cenY=stage.height()/2;
 28 
 29    //創建背景層
 30    var bgLayer=new Konva.Layer();
 31    stage.add(bgLayer);
 32 
 33    //繪制背景
 34    var innerRadius=252/2;//內環的半徑
 35    var outerRadius=220;//外環的半徑
 36 
 37    // 創建背景內環虛線圓
 38    var innercircle=new Konva.Circle({
 39       x:cenX,
 40       y:cenY,
 41       radius:innerRadius,
 42       stroke:"#C1C1C1", //注意是stroke 不是strokeStyle
 43       strokeWidth:3,
 44       dash:[10,4] //dash設置虛線 10實線 4空
 45    });
 46    //把 內環虛線圓添加到背景層中
 47    bgLayer.add(innercircle);
 48 
 49    //創建背景的外環的虛線圓
 50    var outercircle=new Konva.Circle({
 51       x:cenX,
 52       y:cenY,
 53       radius:outerRadius,
 54       stroke:"#C1C1C1", //注意是stroke 不是strokeStyle
 55       strokeWidth:3,
 56       dash:[10,4] //dash設置虛線 10實線 4空
 57    });
 58    //把外虛線圓,添加到層中。
 59    bgLayer.add(outercircle);
 60 
 61 
 62    //把中心圓形添加到層中
 63    var cenCircleText=new CircleText({
 64       x:cenX,
 65       y:cenY,
 66       innerRadius:132/2,
 67       outerRadius:90,
 68       text:'Web全棧',
 69       innerStyle:'#525A82',
 70       outerStyle:'#E1E1E1'
 71    });
 72 
 73    cenCircleText.addToGroupLayer(bgLayer);
 74    bgLayer.draw();//渲染層
 75 
 76    //動畫層的繪制
 77    var animateLayer=new Konva.Layer();
 78    stage.add(animateLayer);
 79 
 80    //創建2環的組
 81    var Group2=new Konva.Group({
 82       x:cenX,//組內的 x,y坐標。
 83       y:cenY
 84    });
 85 
 86    //添加2環的圓
 87    //2環上的 CSS3形狀組
 88    var CircleText_CSS3=new CircleText({
 89       x:innerRadius*Math.cos(30*Math.PI/180),//圓的x,y坐標
 90       y:innerRadius*Math.sin(30*Math.PI/180),
 91       innerRadius:30,   //內圓半徑
 92       outerRadius:40,   //外圓的半徑
 93       innerStyle:'yellow', //內圓填充的顏色
 94       outerStyle:'#E1E1E1',   //外圓環填充的顏色
 95       text:'CSS3'
 96    });
 97    CircleText_CSS3.addToGroupLayer(Group2);
 98 
 99    //添加2環的圓
100    //2環上HTML5的圓形組
101    var CircleText_HTML5=new CircleText({
102       x:innerRadius*Math.cos(240*Math.PI/180),//文本圓的x坐標
103       y:innerRadius*Math.sin(240*Math.PI/180),//文本圓的y坐標
104       innerRadius:30,         // 內圓半徑
105       outerRadius:40,         // 外圓半徑
106       innerStyle:'orange',    //內部填充樣式
107       outerStyle:'#E1E1E1',   //外圓的樣式
108       text:'HTML5'            // 內圓的文本
109    });
110    CircleText_HTML5.addToGroupLayer(Group2);
111 
112    //添加2環的圓
113    //2環上js的圓形組
114    var CircleText_js=new CircleText({
115       x:innerRadius*Math.cos(150*Math.PI/180),
116       y:innerRadius*Math.sin(150*Math.PI/180),
117       innerRadius:35,
118       outerRadius:45,
119       innerStyle:'green',
120       outerStyle:'#E1E1E1',
121       text:'Javascript'
122    });
123    CircleText_js.addToGroupLayer(Group2);
124 
125    animateLayer.add(Group2);//第二層的組添加到層上
126 
127    //創建3環的的組
128    var Group3=new Konva.Group({
129       x:cenX,
130       y:cenY
131    });
132    //繪制3環圓
133    var CircleText_vue=new CircleText({
134       x:outerRadius*Math.cos(90*Math.PI/180),
135       y:outerRadius*Math.sin(90*Math.PI/180),
136       innerRadius:40,
137       outerRadius:50,
138       innerStyle:'blue',
139       outerStyle:'#E1E1E1',
140       text:'vue'
141    });
142    CircleText_vue.addToGroupLayer(Group3);
143 
144    var CircleText_bs=new CircleText({
145       x:outerRadius*Math.cos(200*Math.PI/180),
146       y:outerRadius*Math.sin(200*Math.PI/180),
147       innerRadius:45,
148       outerRadius:55,
149       innerStyle:'#E92322',
150       outerStyle:'#E1E1E1',
151       text:'Bootstrap'
152    });
153    CircleText_bs.addToGroupLayer(Group3);
154 
155    var CircleText_jq=new CircleText({
156       x:outerRadius*Math.cos(30*Math.PI/180),
157       y:outerRadius*Math.sin(30*Math.PI/180),
158       innerRadius:35,
159       outerRadius:45,
160       innerStyle:'#A735D8',
161       outerStyle:'#E1E1E1',
162       text:'jQuery'
163    });
164    CircleText_jq.addToGroupLayer(Group3);
165    animateLayer.add(Group3);//3環的組添加到層上
166 
167    animateLayer.draw();
168 
169 
170    var rotateAnglPerSecond=60;////每秒鍾設置旋轉60
171    //Konva幀動畫系統
172    var animate=new Konva.Animation(
173       function(frame){
174          //每隔一會執行此方法,類似 setInterval
175          //timeDiff: 兩幀之間時間差。是變化的,根據電腦性能和瀏覽器的狀態動態變化。
176          //計算 當前幀需要旋轉的角度。
177         var rotateAngle=rotateAnglPerSecond*frame.timeDiff/1000;//上一幀到當前幀的時間差 毫秒
178          Group2.rotate(rotateAngle);// 不是弧度,是角度
179          //獲得二環上圓的內部組進行反向旋轉
180          Group2.getChildren().each(function(item,index){
181             item.rotate(-rotateAngle);
182          });
183 
184          //3環逆旋轉
185          Group3.rotate(-rotateAngle);
186          //獲得三環上圓的內部組進行反向旋轉
187          Group3.getChildren().each(function(item,index){
188             item.rotate(rotateAngle);
189          });
190 
191       },animateLayer);
192    animate.start();//啟動動畫
193 
194 
195    //Konva 事件系統
196    //給動畫層綁定一個鼠標移上去的事件
197    animateLayer.on('mouseover',function(){
198       //設置旋轉角度
199       rotateAnglPerSecond=10;//設置旋轉的角度為10度,旋轉變慢。
200    });
201    //給動畫層綁定 mouseout離開的事件。
202    animateLayer.on('mouseout',function(){
203       //當鼠標移開的時候,旋轉加快
204       rotateAnglPerSecond=60;//設置旋轉角度為60度,旋轉變快
205    });
206 
207 
208 </script>
209 </body>
210 </html>

2、CircleText.js

 1 /**
 2  * Created by Administrator on 2018/2/1.
 3  */
 4 function CircleText(option){
 5     this._init(option);//構造函數默認執行初始化工作
 6 }
 7 
 8 CircleText.prototype={
 9     _init:function(option){
10         this.x=option.x||0; //圓形組的中心點坐標
11         this.y=option.y||0;
12         this.innerRadius=option.innerRadius||0; //內圓半徑
13         this.outerRadius=option.outerRadius||0;
14         this.text=option.text||'canvas';        //圓內的文字
15         this.innerStyle=option.innerStyle||'red'; //內圓的填充樣式
16         this.outerStyle=option.outerStyle||'blue';//外圓的填充樣式
17 
18         //創建文字和圓形的一個組
19         this.group=new Konva.Group({
20             x:this.x,//設置組的x,y坐標后,所有的內部元素按照組內的新坐標系定位。
21             y:this.y
22         });
23 
24         //初始化一個內部圓
25         var innerCircle=new Konva.Circle({ //創建一個圓
26             x:0,
27             y:0,
28             radius:this.innerRadius, //圓的半徑
29             fill:this.innerStyle,    //圓的填充顏色
30             opacity:.8
31         });
32         //把內部圓,添加到組內
33         this.group.add(innerCircle);
34 
35         //初始化一個圓環
36         var outerRing=new Konva.Ring({//初始化一個圓環
37             x:0,
38             y:0,
39             innerRadius:this.innerRadius,   //內圓的半徑
40             outerRadius:this.outerRadius,   //外圓的半徑
41             fill:this.outerStyle,           //圓環的填充的樣式
42             opacity:.3                      //透明度
43         });
44         //把外環,添加到組內
45         this.group.add(outerRing);
46 
47         //初始化一個文字
48         var text=new Konva.Text({
49             x:0-this.outerRadius,
50             y:-7,
51             width:this.outerRadius*2,   //文字的寬度
52             fill:'#fff',    //文字的顏色
53             text:this.text, //文字的內容
54             align:'center' , //居中顯示
55             fontStyle: 'bold'//字體加粗
56         });
57         //把文字添加到組內
58         this.group.add(text);
59         },
60 
61     //把 組添加到層或者其他組中。
62     addToGroupLayer:function(arg){
63         arg.add(this.group);
64     }
65 
66     }

運行效果:


免責聲明!

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



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