Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Анимация окружности канвас (https://javascript.ru/forum/dom-window/47604-animaciya-okruzhnosti-kanvas.html)

imedia 30.05.2014 19:35

Анимация окружности канвас
 
Скажите пожалуйста как анимировать дугу от начала до конца чтобы она как бы открылась? Это должна быть раскрывающаяся диаграмма, И еще один вопрос как сделать четче канвас
<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>

trikadin 31.05.2014 14:25

Можно каждый раз через таймер или requestAnimationFrame отрисовывать чуть большую дугу.

рони 31.05.2014 17:43

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>

imedia 31.05.2014 17:51

Я нашел интересный тоже метод, мне он очень понравился только не могу понять как очередность анимации установить , я хочу например чтобы после того как черная дуга отрисуется начала отрисовываться другая дуга
<!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>

рони 31.05.2014 18:08

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 31.05.2014 18:12

РониМожете прокомментировать, например зачем здесь дата используется?

рони 31.05.2014 18:20

imedia,
startTime = new Date().getTime(); начало анимации
var time = (new Date().getTime()- startTime)/ duration; какой процент от запланированного времени прошёл
от 0 до >=1

imedia 31.05.2014 18:59

И можно еще сюда коммент, я не пойму как мне дальше анимации вставлять, что это за принцип и что такое requestAnimationFrame(run)
if(time < 1) {requestAnimationFrame(run);
          endAngle = startAngle +(endAngle - startAngle)* time;
        }
        else {
          duration = 1000,
          startTime = new Date().getTime();
          run_two();
        };

Это что рекурсия?

рони 31.05.2014 19:31

imedia,
if(time < 1) если время невышло
requestAnimationFrame(run); запустить функцию повторно когда у браузера будет время
endAngle = startAngle +(endAngle - startAngle)* time; вычислить угол поворота на текущее время
else иначе
duration = 1000, установить новую продолжительность анимации (если необходимо)
startTime = new Date().getTime(); установить точку отсчёта во времени время начала старта
run_two(); стартовать другую функцию -- run больше незапускать

imedia 31.05.2014 22:04

Так это что для часов или секундомера сделано, что значит время не вышло и когда у браузера будет время, для чего тут вообще учет времени, я хотел диаграмму раскрывающуюся сделать

рони 31.05.2014 22:13

imedia,
:-?

nerv_ 31.05.2014 23:20

Цитата:

Сообщение от imedia
для чего тут вообще учет времени, я хотел диаграмму раскрывающуюся сделать

рони, человеку диаграмма нужна раскрывающаяся, а ты ему про время :)
Времени всегда не хватает. Больше о времени ничего знать не нужно :no:

imedia 02.06.2014 12:50

разобрался, а почему у меня красный не появляется?
<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>

рони 02.06.2014 12:58

imedia,
а где в коде прорисовка красного?

imedia 02.06.2014 17:23

а куда ее прописать? напишите пожалуйста

рони 02.06.2014 17:28

imedia,
строка 52 -- должно быть похожее на строки 31 - 34 или 65 - 68

imedia 02.06.2014 18:26

а почему тогда черная дуга меняет свой цвет на красный? Я сделал как вы сказали

рони 02.06.2014 19:48

imedia,
функция 1 - рисуем/стираем 1 дугу - постепенно
функция 2 - рисуем/стираем 1 дугу мгновенно - 2 дугу постепенно
функция 3 - рисуем/стираем 1 и 2 дугу мгновенно - 3 дугу постепенно - понимаешь
стираем для сглаживания иначе больше квадратов из-за наложения слоёв

imedia 03.06.2014 16:38

Можете мне сказать почему черный круг вдруг возвращается назад на 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>

рони 03.06.2014 17:11

imedia,
круг не возвращается - это вы четверть круга выкусываите -- прямоугольником стирания

imedia 03.06.2014 17:17

а как же сделать чтобы черный круг был на 360 градусов, а остальные в зависимости от установленных углов?
можно не стирать вообще а просто рисовать круги с установленными радианами?

рони 03.06.2014 17:32

imedia,
вы задали холст
Цитата:

Сообщение от imedia
canvas.width=1200;10 canvas.height=600;

а стираите только четвертушку

Цитата:

Сообщение от imedia
context.clearRect(0, 0, 600, 300);

перестаньте писать бред в стиль или css
Цитата:

Сообщение от imedia
canvas.style.width=600;08 canvas.style.height=300;


у canvas для это есть атрибуты или свойства

стирать или нет воля ваша -- если дуга прирастает проблема только в чёткости -- но уменьшить дугу без стирания неполучится

imedia 03.06.2014 17:34

это не бред я таким образом задаю разрешение канвы

svetlika 05.06.2014 09:54

Так это что для часов или секундомера сделано, что значит время не вышло и когда у браузера будет время, для чего тут вообще учет времени, я хотел диаграмму раскрывающуюся сделать
_____________
метални врати, решетки


Часовой пояс GMT +3, время: 06:58.