用canvas實現圍繞旋轉動畫
阿新 • • 發佈:2019-01-28
使用canvas的convas來實現圍繞旋轉動畫,外圈順時針,裡層逆時針
html檔案
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> body { margin: 0; padding: 0; overflow: hidden; background-color: #f0f0f0; } </style> <script src="js/konva.js"></script> <script src="js/circle.js"></script> </head> <body> <div id="cas"></div> <script> var width = window.innerWidth; var height = window.innerHeight; //建立舞臺 var stage = new Konva.Stage({ container: "cas", width: width, height: height }); //建立層 var layer = new Konva.Layer(); //建立組1 var group = new Konva.Group({ x: stage.width() / 2, y: stage.height() / 2, }); //最外層圓 var circle1 = new Konva.Circle({ x: 0, y: 0, radius: 250, stroke: "#ccc", strokeWidth: 1, dash: [6, 3] }); group.add(circle1); //第二個圓 var circle2 = new Konva.Circle({ x: 0, y: 0, radius: 150, stroke: "#ccc", strokeWidth: 1, dash: [6, 3] }); group.add(circle2); //第三個圓 var circle3 = new Konva.Circle({ x: 0, y: 0, radius: 135, stroke: "blue", strokeWidth: 2, dash: [10, 5] }); group.add(circle3); //第四個圓 var circle4 = new Konva.Circle({ x: 0, y: 0, radius: 105, fill: "#ccc", opacity: 0.4 }); group.add(circle4); //第五個圓 var circle5 = new Konva.Circle({ x: 0, y: 0, radius: 80, fill: "#74A2F0" }); group.add(circle5); //新增文字 var text = new Konva.Text({ x: -80, y: -12, text: "WEB全棧", fill: "white", fontSize: 24, width: 160, align: "center" }); group.add(text); layer.add(group); //***************************************************** //建立組2 var outGroup = new Konva.Group({ x: stage.width() / 2, y: stage.height() / 2, }); var arrColor = ["red", "green", "blue", "orange", "purple"]; var arrText = ["web", "node.js", "ajax", "html5", "css"]; for(var i = 0; i < 5; i++) { var cir = new Circle({ x : 250 * Math.cos(72 * i * Math.PI / 180), //圓心x軸的座標 y : 250 * Math.sin(72 * i * Math.PI / 180), //圓心y軸的座標 outR : 60, //外圓的半徑 inR : 50, //內圓的半徑 fill : arrColor[i], //填充顏色 text: arrText[i], //文字 outOpacity : 0.3, //外圓的透明度 inOpacity : 0.6 //內圓的透明度 }); cir.drawCircle(outGroup); } layer.add(outGroup); //*********************************************** //建立組3 var inGroup = new Konva.Group({ x: stage.width() / 2, y: stage.height() / 2, }); var arrColor = ["red", "green", "blue", "orange", "purple"]; var arrText = ["web", "node.js", "ajax", "html5", "css"]; for(var i = 0; i < 5; i++) { var cir = new Circle({ x : 135 * Math.cos(90 * i * Math.PI / 180), //圓心x軸的座標 y : 135 * Math.sin(90 * i * Math.PI / 180), //圓心y軸的座標 outR : 45, //外圓的半徑 inR : 35, //內圓的半徑 fill : arrColor[i], //填充顏色 text: arrText[i], //文字 outOpacity : 0.3, //外圓的透明度 inOpacity : 0.6 //內圓的透明度 }); cir.drawCircle(inGroup); } layer.add(inGroup); //************************************************ //運動動畫 var step = 1; //轉動的角度 var anim = new Konva.Animation(function() { outGroup.rotate(step); outGroup.getChildren().each(function (ele, index) { ele.rotate(-step); }); inGroup.rotate(-step); inGroup.getChildren().each(function (ele, index) { ele.rotate(step); }); }, layer); anim.start(); stage.add(layer); stage.on("mouseover", function () { step = 0.3; }); stage.on("mouseout", function () { step = 1; }); </script> </body> </html>
js檔案
function Circle(obj) { this._init(obj); } Circle.prototype = { _init: function (obj) { this.x = obj.x, //圓心x軸的座標 this.y = obj.y, //圓心y軸的座標 this.outR = obj.outR, //外圓的半徑 this.inR = obj.inR, //內圓的半徑 this.color = obj.fill, //填充顏色 this.text = obj.text, //內圓的文字 this.outOpacity = obj.outOpacity, //外圓的透明度 this.inOpacity = obj.inOpacity //內圓的透明度 }, drawCircle: function (group) { //建立一個組 var groupCir = new Konva.Group({ x: this.x, y: this.y }); //外圓 var outCir = new Konva.Circle({ x: 0, y: 0, radius: this.outR, fill: this.color, opacity: this.outOpacity }); groupCir.add(outCir); //內圓 var inCir = new Konva.Circle({ x: 0, y: 0, radius: this.inR, fill: this.color, opacity: this.inOpacity }); groupCir.add(inCir); //新增文字 var text = new Konva.Text({ x: -this.inR, y: -10, text: this.text, fill: "white", fontSize: 20, width: 2 * this.inR, align: "center" }); groupCir.add(text); group.add(groupCir); } }
效果圖片: