Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.05.2014, 19:35
Профессор
Отправить личное сообщение для imedia Посмотреть профиль Найти все сообщения от imedia
 
Регистрация: 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>
Ответить с цитированием
  #2 (permalink)  
Старый 31.05.2014, 14:25
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Можно каждый раз через таймер или requestAnimationFrame отрисовывать чуть большую дугу.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #3 (permalink)  
Старый 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.
Ответить с цитированием
  #4 (permalink)  
Старый 31.05.2014, 17:51
Профессор
Отправить личное сообщение для imedia Посмотреть профиль Найти все сообщения от imedia
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 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>
Ответить с цитированием
  #6 (permalink)  
Старый 31.05.2014, 18:12
Профессор
Отправить личное сообщение для imedia Посмотреть профиль Найти все сообщения от imedia
 
Регистрация: 20.05.2014
Сообщений: 292

РониМожете прокомментировать, например зачем здесь дата используется?
Ответить с цитированием
  #7 (permalink)  
Старый 31.05.2014, 18:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

imedia,
startTime = new Date().getTime(); начало анимации
var time = (new Date().getTime()- startTime)/ duration; какой процент от запланированного времени прошёл
от 0 до >=1
Ответить с цитированием
  #8 (permalink)  
Старый 31.05.2014, 18:59
Профессор
Отправить личное сообщение для imedia Посмотреть профиль Найти все сообщения от imedia
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 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 больше незапускать
Ответить с цитированием
  #10 (permalink)  
Старый 31.05.2014, 22:04
Профессор
Отправить личное сообщение для imedia Посмотреть профиль Найти все сообщения от imedia
 
Регистрация: 20.05.2014
Сообщений: 292

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CSS анимация после :target gJam (X)HTML/CSS 0 01.08.2013 22:42
Анимация в real-time приложениях(Нужны советы) ak-o AJAX и COMET 5 05.04.2013 11:34
Не работает анимация при загрузки ajax ArtOs Общие вопросы Javascript 0 24.05.2012 17:52
Анимация. Помогите понять почему не работает. kadurban jQuery 4 08.07.2010 20:50
Цикличность анимация? SashaBorandi jQuery 1 25.12.2008 09:20