30.05.2014, 19:35
|
Профессор
|
|
Регистрация: 20.05.2014
Сообщений: 292
|
|
Анимация окружности канвас
Скажите пожалуйста как анимировать дугу от начала до конца чтобы она как бы открылась? Это должна быть раскрывающаяся диаграмма, И еще один вопрос как сделать четче канвас
<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>
|
|
31.05.2014, 14:25
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Можно каждый раз через таймер или requestAnimationFrame отрисовывать чуть большую дугу.
|
|
31.05.2014, 17:43
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
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>
Последний раз редактировалось рони, 31.05.2014 в 17:47.
|
|
31.05.2014, 17:51
|
Профессор
|
|
Регистрация: 20.05.2014
Сообщений: 292
|
|
Я нашел интересный тоже метод, мне он очень понравился только не могу понять как очередность анимации установить , я хочу например чтобы после того как черная дуга отрисуется начала отрисовываться другая дуга
<!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, 31.05.2014 в 18:03.
|
|
31.05.2014, 18:08
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
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>
|
|
31.05.2014, 18:12
|
Профессор
|
|
Регистрация: 20.05.2014
Сообщений: 292
|
|
РониМожете прокомментировать, например зачем здесь дата используется?
|
|
31.05.2014, 18:20
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
imedia,
startTime = new Date().getTime(); начало анимации
var time = (new Date().getTime()- startTime)/ duration; какой процент от запланированного времени прошёл
от 0 до >=1
|
|
31.05.2014, 18:59
|
Профессор
|
|
Регистрация: 20.05.2014
Сообщений: 292
|
|
И можно еще сюда коммент, я не пойму как мне дальше анимации вставлять, что это за принцип и что такое requestAnimationFrame(run)
if(time < 1) {requestAnimationFrame(run);
endAngle = startAngle +(endAngle - startAngle)* time;
}
else {
duration = 1000,
startTime = new Date().getTime();
run_two();
};
Это что рекурсия?
Последний раз редактировалось imedia, 31.05.2014 в 19:01.
|
|
31.05.2014, 19:31
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
imedia,
if(time < 1) если время невышло
requestAnimationFrame(run); запустить функцию повторно когда у браузера будет время
endAngle = startAngle +(endAngle - startAngle)* time; вычислить угол поворота на текущее время
else иначе
duration = 1000, установить новую продолжительность анимации (если необходимо)
startTime = new Date().getTime(); установить точку отсчёта во времени время начала старта
run_two(); стартовать другую функцию -- run больше незапускать
|
|
31.05.2014, 22:04
|
Профессор
|
|
Регистрация: 20.05.2014
Сообщений: 292
|
|
Так это что для часов или секундомера сделано, что значит время не вышло и когда у браузера будет время, для чего тут вообще учет времени, я хотел диаграмму раскрывающуюся сделать
|
|
|
|