Анимация окружности канвас
Скажите пожалуйста как анимировать дугу от начала до конца чтобы она как бы открылась? Это должна быть раскрывающаяся диаграмма, И еще один вопрос как сделать четче канвас
<html> <head> <script src="/js/jquery-1.9.1.min.js"></script> <style> #canvas /* стили для canvas*/ { position:absolute; width:600px; /*ширина*/ height:300px; /*высота*/ display:block; /*превратим элемент в блочный*/ /* background:rgba(255,255,255,1); */ /*цвет фона*/ border: 1px solid black; /*рамка*/ } </style> </head> <body> <canvas id="canvas"> Браузер не поддерживает canvas</canvas> <script> window.onload = function (){ var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var context_a = canvas.getContext('2d'); //координаты центра окружности (распологается в центре холсте) var x = canvas.width /2; var y = canvas.height / 2; //радиус 100px var radius = 50; //начальный и конечный углы (тригонометрия x_X) var startAngle = 17*Math.PI/7; var endAngle = 13*Math.PI/2.9; var counterClockwise = false;//направление дуги. По умолчанию false context.lineWidth = 22; context.strokeStyle = 'rgba(255,255,255,1)'; //начало пути, рисуем круг с нашими параметрами и обводим context.beginPath(); context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); var startAngle2 = 10*Math.PI/7; var endAngle2 = 2*Math.PI/1.0; var radius2 = 55; context_a.lineWidth = 8; context_a.strokeStyle = 'rgba(204,0,65,1)'; //начало пути, рисуем круг с нашими параметрами и обводим context_a.beginPath(); context_a.arc(x, y, radius2, startAngle2, endAngle2, counterClockwise); context_a.stroke(); var radius2 = 45; context_a.lineWidth = 8; context_a.strokeStyle = 'rgba(251,79,134,1)'; //начало пути, рисуем круг с нашими параметрами и обводим context_a.beginPath(); context_a.arc(x, y, radius2, startAngle2, endAngle2, counterClockwise); context_a.stroke(); //ширина и цвет круга } </script> </body> </html> |
Можно каждый раз через таймер или requestAnimationFrame отрисовывать чуть большую дугу.
|
imedia,
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <style> #canvas /* стили для canvas*/ { border: 1px solid black; /*рамка*/ } </style> </head> <body> <canvas id="canvas" width="600" height="300"> Браузер не поддерживает canvas</canvas> <script> window.onload = function() { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var x = canvas.width /2; var y = canvas.height / 2; var radius = 50; var counterClockwise = false; var run = function() { var time = (new Date().getTime()- startTime)/ duration; var startAngle = 10*Math.PI/7; var endAngle = 2*Math.PI/1.0;; context.lineWidth = 8; context.strokeStyle = 'rgba(204,0,65,1)'; if(time < 1) {requestAnimationFrame(run); endAngle = startAngle +(endAngle - startAngle)* time; } context.clearRect(0, 0, 600, 300); context.beginPath(); context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); context.strokeStyle = 'rgba(251,79,134,1)'; context.beginPath(); context.arc(x, y, radius-15, startAngle, endAngle, counterClockwise); context.stroke(); } var duration = 4000, startTime = new Date().getTime(); run(); } </script> </body> |
Я нашел интересный тоже метод, мне он очень понравился только не могу понять как очередность анимации установить , я хочу например чтобы после того как черная дуга отрисуется начала отрисовываться другая дуга
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <style> #canvas /* стили для canvas*/ { position:absolute; left:-500px; border: 1px solid black; /*рамка*/ } </style> </head> <body> <canvas id="canvas" width="300" height="150"> Браузер не поддерживает canvas</canvas> <script> var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); canvas.style.width=300; canvas.style.height=150; canvas.width=1200; canvas.height=600; var x = canvas.width / 2; var y = canvas.height / 2; var radius = 150; // Use objects to hold our draw and erase props var drawProps = { startAngle: -90, speed: 2, color: 'black', counterClockwise: false, globalCompositeOperation: context.globalCompositeOperation, lineWidth: 22 }; /* var eraseProps = { startAngle: 180, speed: -2, color: 'white', counterClockwise: true, globalCompositeOperation: "destination-out", lineWidth: 15 // artefacts appear unless we increase lineWidth for erase }; */ // Let's work in degrees as they're easier for humans to understand var degrees = -90; var props = drawProps; // start the animation loop setInterval(draw.bind(null,0), 10).queue(function() {alert()}); function draw(as) { /***************/ degrees += props.speed; if (degrees >= as) { return false; } else{ context.beginPath(); context.arc( x, y, radius, getRadians(props.startAngle), getRadians(degrees), props.counterClockwise ); context.lineWidth = props.lineWidth; context.strokeStyle = props.color; context.stroke(); } // Start erasing when we hit 360 degrees /* if (degrees >= 360) { context.closePath(); props = eraseProps; context.globalCompositeOperation = props.globalCompositeOperation; } // Start drawing again when we get back to 0 degrees if (degrees <= 0) { canvas.width = canvas.width; // Clear the canvas for better performance (I think) context.closePath(); props = drawProps; context.globalCompositeOperation = props.globalCompositeOperation; } */ /************************************************/ } // Helper method to convert degrees to radians function getRadians(degrees) { return degrees * (Math.PI / 180); } </script> <body></html> |
imedia,
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <style> #canvas /* стили для canvas*/ { border: 1px solid black; /*рамка*/ } </style> </head> <body> <canvas id="canvas" width="600" height="300"> Браузер не поддерживает canvas</canvas> <script> window.onload = function() { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var x = canvas.width /2; var y = canvas.height / 2; var radius = 50; var counterClockwise = false; var run = function() { var time = (new Date().getTime()- startTime)/ duration; var startAngle = 10*Math.PI/7; var endAngle = 2*Math.PI/1.0;; context.lineWidth = 8; context.strokeStyle = 'rgba(204,0,65,1)'; if(time < 1) {requestAnimationFrame(run); endAngle = startAngle +(endAngle - startAngle)* time; } else { duration = 4000, startTime = new Date().getTime(); run_two(); }; context.clearRect(0, 0, 600, 300); context.beginPath(); context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); }; function run_two() { var time = (new Date().getTime()- startTime)/ duration; var startAngle = 10*Math.PI/7; var endAngle = 2*Math.PI/1.0;; context.lineWidth = 8; context.strokeStyle = 'rgba(204,0,65,1)'; context.clearRect(0, 0, 600, 300); context.beginPath(); context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); if(time < 1) {requestAnimationFrame(run_two); endAngle = startAngle +(endAngle - startAngle)* time; }; context.strokeStyle = 'rgba(251,79,134,1)'; context.beginPath(); context.arc(x, y, radius-15, startAngle, endAngle, counterClockwise); context.stroke(); } var duration = 4000, startTime = new Date().getTime(); run(); } </script> </body> </html> |
РониМожете прокомментировать, например зачем здесь дата используется?
|
imedia,
startTime = new Date().getTime(); начало анимации var time = (new Date().getTime()- startTime)/ duration; какой процент от запланированного времени прошёл от 0 до >=1 |
И можно еще сюда коммент, я не пойму как мне дальше анимации вставлять, что это за принцип и что такое requestAnimationFrame(run)
if(time < 1) {requestAnimationFrame(run); endAngle = startAngle +(endAngle - startAngle)* time; } else { duration = 1000, startTime = new Date().getTime(); run_two(); }; Это что рекурсия? |
imedia,
if(time < 1) если время невышло requestAnimationFrame(run); запустить функцию повторно когда у браузера будет время endAngle = startAngle +(endAngle - startAngle)* time; вычислить угол поворота на текущее время else иначе duration = 1000, установить новую продолжительность анимации (если необходимо) startTime = new Date().getTime(); установить точку отсчёта во времени время начала старта run_two(); стартовать другую функцию -- run больше незапускать |
Так это что для часов или секундомера сделано, что значит время не вышло и когда у браузера будет время, для чего тут вообще учет времени, я хотел диаграмму раскрывающуюся сделать
|
Часовой пояс GMT +3, время: 10:09. |