注意引入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>
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 }
运行效果: