Анимация окружности канвас
Скажите пожалуйста как анимировать дугу от начала до конца чтобы она как бы открылась? Это должна быть раскрывающаяся диаграмма, И еще один вопрос как сделать четче канвас
<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 больше незапускать |
Так это что для часов или секундомера сделано, что значит время не вышло и когда у браузера будет время, для чего тут вообще учет времени, я хотел диаграмму раскрывающуюся сделать
|
imedia,
:-? |
Цитата:
Времени всегда не хватает. Больше о времени ничего знать не нужно :no: |
разобрался, а почему у меня красный не появляется?
<html> <body> <canvas id="canvas"> Браузер не поддерживает canvas</canvas> <script> window.onload = function() { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); canvas.style.width=600; canvas.style.height=300; canvas.width=1200; canvas.height=600; var x = canvas.width /2; var y = canvas.height / 2; var counterClockwise = false; var run_black = function() { var radius = 210; var time = (new Date().getTime()- startTime)/ duration; var startAngle = getRadians(-90); var endAngle = getRadians(180); context.lineWidth = 4; context.strokeStyle = 'rgba(0,0,0,1)'; if(time < 1) {requestAnimationFrame(run_black); endAngle = startAngle +(endAngle - startAngle)* time; } else { duration = 1000, startTime = new Date().getTime(); run_red(); }; context.clearRect(0, 0, 600, 300); context.beginPath(); context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); }; var run_red = function() { var time = (new Date().getTime()- startTime)/ duration; var radius = 250; var startAngle = getRadians(-90); var endAngle = getRadians(0); if(time < 1) {requestAnimationFrame(run_red); endAngle = startAngle +(endAngle - startAngle)* time; } else { duration = 1000, startTime = new Date().getTime(); run_rose(); }; context.clearRect(0, 0, 600, 300); context.beginPath(); context.strokeStyle = 'rgba(175,9,54,1)'; context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); }; function run_rose() { var time = (new Date().getTime()- startTime)/ duration; var startAngle = getRadians(-90); var endAngle = getRadians(0); context.lineWidth = 22; var radius = 150; if(time < 1) {requestAnimationFrame(run_rose); endAngle = startAngle +(endAngle - startAngle)* time; }; context.clearRect(0, 0, 600, 300); context.beginPath(); context.strokeStyle = 'rgba(251,79,134,1)'; context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); } var duration = 1000, startTime = new Date().getTime(); run_black(); function getRadians(degrees) { return degrees * (Math.PI / 180); } } </script> </body> |
imedia,
а где в коде прорисовка красного? |
а куда ее прописать? напишите пожалуйста
|
imedia,
строка 52 -- должно быть похожее на строки 31 - 34 или 65 - 68 |
а почему тогда черная дуга меняет свой цвет на красный? Я сделал как вы сказали
|
imedia,
функция 1 - рисуем/стираем 1 дугу - постепенно функция 2 - рисуем/стираем 1 дугу мгновенно - 2 дугу постепенно функция 3 - рисуем/стираем 1 и 2 дугу мгновенно - 3 дугу постепенно - понимаешь стираем для сглаживания иначе больше квадратов из-за наложения слоёв |
Можете мне сказать почему черный круг вдруг возвращается назад на 90 градусов?
<canvas id="canvas"> Браузер не поддерживает canvas</canvas> <script> window.onload = function() { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); canvas.style.width=600; canvas.style.height=300; canvas.width=1200; canvas.height=600; var x = canvas.width /2; var y = canvas.height / 2; var counterClockwise = false; var run_wight = function() { var radius = 195; var time = (new Date().getTime()- startTime)/ duration; var startAngle = getRadians(-90); var endAngle = getRadians(360); context.lineWidth = 4; context.strokeStyle = 'rgba(0,0,0,1)'; if(time < 1) {requestAnimationFrame(run_wight); endAngle = startAngle +(endAngle - startAngle)* time; } else { duration = 1000, startTime = new Date().getTime(); run_red(); }; context.clearRect(0, 0, 600, 300); context.beginPath(); context.lineWidth = 4; context.strokeStyle = 'rgba(0,0,0,1)'; context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); }; var run_red = function() { var time = (new Date().getTime()- startTime)/ duration; var radius = 210; var startAngle = getRadians(-90); var endAngle = getRadians(0); context.strokeStyle = 'rgba(175,9,54,1)'; context.lineWidth = 22; if(time < 1) {requestAnimationFrame(run_red); endAngle = startAngle +(endAngle - startAngle)* time; } else { duration = 1000, startTime = new Date().getTime(); run_rose(); }; context.clearRect(0, 0, 600, 300); context.beginPath(); context.lineWidth = 22; context.strokeStyle = 'rgba(175,9,54,1)'; context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); }; function run_rose() { var time = (new Date().getTime()- startTime)/ duration; var startAngle = getRadians(-90); var endAngle = getRadians(0); context.lineWidth = 22; var radius = 180; if(time < 1) {requestAnimationFrame(run_rose); endAngle = startAngle +(endAngle - startAngle)* time; }; context.clearRect(0, 0, 600, 300); context.beginPath(); context.strokeStyle = 'rgba(251,79,134,1)'; context.arc(x, y, radius, startAngle, endAngle, counterClockwise); context.stroke(); } var duration = 1000, startTime = new Date().getTime(); run_wight(); function getRadians(degrees) { return degrees * (Math.PI / 180); } } </script> |
imedia,
круг не возвращается - это вы четверть круга выкусываите -- прямоугольником стирания |
а как же сделать чтобы черный круг был на 360 градусов, а остальные в зависимости от установленных углов?
можно не стирать вообще а просто рисовать круги с установленными радианами? |
imedia,
вы задали холст Цитата:
Цитата:
Цитата:
у canvas для это есть атрибуты или свойства стирать или нет воля ваша -- если дуга прирастает проблема только в чёткости -- но уменьшить дугу без стирания неполучится |
это не бред я таким образом задаю разрешение канвы
|
Так это что для часов или секундомера сделано, что значит время не вышло и когда у браузера будет время, для чего тут вообще учет времени, я хотел диаграмму раскрывающуюся сделать
_____________ метални врати, решетки |
Часовой пояс GMT +3, время: 06:58. |