本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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"
>
12
</
div
>
14
<
script
>
15
//
创建舞台
16
var
stage
=
new
Konva.Stage({
17
container:
'
container
'
,
18
width:window.innerWidth,
//
全屏
19
height:window.innerHeight
21
});
23
//
创建层
25
//
中心点坐标
26
var
cenX
=
stage.width()
/
2;
27
var
cenY
=
stage.height()
/
2;
29
//
创建背景层
30
var
bgLayer
=
new
Konva.Layer();
31
stage.add(bgLayer);
33
//
绘制背景
34
var
innerRadius
=
252
/
2;
//
内环的半径
35
var
outerRadius
=
220
;
//
外环的半径
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);
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);
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
});
73
cenCircleText.addToGroupLayer(bgLayer);
74
bgLayer.draw();
//
渲染层
76
//
动画层的绘制
77
var
animateLayer
=
new
Konva.Layer();
78
stage.add(animateLayer);
80
//
创建2环的组
81
var
Group2
=
new
Konva.Group({
82
x:cenX,
//
组内的 x,y坐标。
83
y:cenY
84
});
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);
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);
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);
125
animateLayer.add(Group2);
//
第二层的组添加到层上
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);
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);
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环的组添加到层上
167
animateLayer.draw();
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
});
184
//
3环逆旋转
185
Group3.rotate(
-
rotateAngle);
186
//
获得三环上圆的内部组进行反向旋转
187
Group3.getChildren().each(
function
(item,index){
188
item.rotate(rotateAngle);
189
});
191
},animateLayer);
192
animate.start();
//
启动动画
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
});
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);//构造函数默认执行初始化工作
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';//外圆的填充样式
18 //创建文字和圆形的一个组
19 this.group=new Konva.Group({
20 x:this.x,//设置组的x,y坐标后,所有的内部元素按照组内的新坐标系定位。
21 y:this.y
22 });
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);
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);
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 },
61 //把 组添加到层或者其他组中。
62 addToGroupLayer:function(arg){
63 arg.add(this.group);
64 }
运行效果:
canvas 中绘制贝塞尔曲线
几乎所有前端2D或3D图形图表库(echarts,d3,three.js)都会使用到贝塞尔曲线
所以掌握贝塞尔曲线势在必得。这篇文章主要是实战篇,不会介绍和贝塞尔相关的知识, 如果有同学对贝塞尔曲线不是很清楚的话:可以查看我这篇文章——深入理解SVG
绘制贝塞尔曲线
第一步我们先创建ctx, 用ctx 画一个二阶贝塞尔曲线看下。二阶贝塞尔曲线有1个控制点,一个起点,一个终点。
const canvas = document.getElementById( 'canvas'
游客izoamw2f43amu