第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     }

运行效果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个爱吃西瓜的程序员

Web前端基础【2】--CSS基础

CSS指层叠样式表,用来定义如何显示HTML元素,一般和HTML配合使用。CSS样式表的目的是为了解决内容与表现分离的问题:即使同一个HTML文档也能表现出外观...

36160
来自专栏分享达人秀

两分钟掌握FrameLayout帧布局

前面学习了线性布局、相对布局、表格布局,那么本期来学习第四种布局——FrameLayout帧布局。 一、认识FrameLayout 帧布局是An...

25490
来自专栏HTML5学堂

你们等了很久的弹性布局(flex),还不快来~!

传统的布局方案中,我们基本都是在基于盒模型,依赖dispaly(显示)、position(定位)以及float(浮动)等属性来操作。但是这些操作需要用到一些特殊...

39750
来自专栏前端知识分享

第141天:前端开发中浏览器兼容性问题总结(二)

在浏览器中想要垂直居中,设置vertical-align:middle; 不起作用。例如:ie6下文本与文本输入框对不齐,需设置vertical-align:m...

25420
来自专栏极乐技术社区

wxss学习《四》字体,组件及API的思维导图

一:字体 一.字体:font。设置对象的文本特性。 1.font-style:文字样式。 取值:normal 正常的字体, italic 斜体字, o...

213100
来自专栏我就是马云飞

仿bilibili刷新按钮的实现

简述 最近跟小伙伴一起讨论了一下,决定一起仿一个BiliBili的app(包括android端和iOS端),我们并没有打算把这个项目完全做完,毕竟我们的重点是掌...

26180
来自专栏Android小菜鸡

自定义View学习之路(五)————彩虹环

  走往android的进阶之路,避不开自定义View的学习和绘制。这里以绘制一个可用的彩虹环为例。开始系统的学习View的绘制。 彩虹环需求:

11320
来自专栏九彩拼盘的叨叨叨

让内容恰好占一屏,适配各种尺寸的设备的实现

有时候我们会有让内容恰好占一屏,并且适配各种尺寸的设备的需求。我们先不谈这样做会导致在一些设备上的显示不尽人意,直接谈如何实现。

12030
来自专栏一个爱瞎折腾的程序猿

自定义滚动条样式(layui.v1)

76110
来自专栏代码世界

前端之CSS内容

一、CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表,它就会按照这个样式表来对文档...

356100

扫码关注云+社区

领取腾讯云代金券