Сделать вращающийся градиент на окружности?
Я пытаюсь получить вращающийся градиент на окружности, чтобы следовать этому макету.
вращающийся градиент, следующий за линией http://f.cl.ly/items/3y161Z3M0t331K3E0j1e/Screen%20Shot%202013-04-09%20at%205.45.37%20PM.png
Я высмеял то, что я пытаюсь сделать в JSFiddle.
Для вашего удобства вот код:
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
var radius = 75;
var startAngle = 0// 1.1 * Math.PI;
var endAngle = 2.0 * Math.PI;//1.9 * Math.PI;
var counterClockwise = false;
context.beginPath();
var gradient = context.createLinearGradient(radius, radius, 0, 0);
gradient.addColorStop(0, '#3b749a');
gradient.addColorStop(1, '#FFFFFF');
context.lineWidth = 15;
context.arc(radius, radius, radius, startAngle, endAngle, counterClockwise);
context.strokeStyle = gradient;
context.stroke(gradient);
А теперь вот мой вызов. Как бы я ни старался, мне не удается заставить градиент следовать по пути. Кажется, это применимо с любой точки зрения оно желает, но не следует по пути. Что я делаю не так?
Во-вторых, можно ли получить закругленный угол на одном краю, как на макете?
Последующий вопрос к несовершенному решению:
Таким образом, кажется, что нет никакого способа обвести путь градиентом, только применить градиент к холсту, который путь "вырезает"."(И в HTML5 нет градиента" circle " AFAIK.)
Поскольку предлагаемое решение требует рисования двух элементов, каков наилучший способ повернуть / оживить это? С одним объектом / контекстом, казалось, я мог просто схватить его, преобразовать и повернуть. С двумя, Нужно ли мне отрисовывать объект изображения и поворачивать?
2 ответов:
На самом деле это было не так уж и тривиально. Возможно, был более простой способ сделать это, и я просто взял жесткий подход. Или, может быть, это что-то новенькое.
Что я сделал, так это нарисовал градиентный прямоугольник внутри круга. На интервале окружность меняет свои начальную и конечную точки так, что зазор вращается. Пока это происходит, Я пересчитываю поле градиента, чтобы вписаться в новый зазор, а затем рисую его там. В результате получается приятный эффект.В этой демонстрации я настроил его чтобы произвольно переключаться по цветам и разным размерам, чтобы показать, как выглядят разные блесны, и повеселиться.
Демо JsFiddle
Мясо операции находится в этой функции:
function showSpinner( startAngle,endAngle,direction,radius,line,context,color,shadow) { context.beginPath(); var a = startAngle / Math.PI; a = a % 2; a = 2 - a; a *= Math.PI; var x = radius + Math.cos(a)*radius*1.7; var y = radius - Math.sin(a)*radius*1.7; var gradient = context.createLinearGradient(radius,radius,x,y); gradient.addColorStop(0.05, color); gradient.addColorStop(.60, '#FFFFFF'); context.lineWidth = line; context.lineCap = "round"; context.shadowBlur = 10; if( shadow === true )context.shadowColor = '#727272'; context.arc(radius, radius, radius-line, startAngle, endAngle, direction); context.strokeStyle = gradient; context.stroke(); }Эта функция использует вышеупомянутую функцию рисования для обеспечения анимации
Но все, что вам действительно нужно сделать, чтобы использовать это, - этоfunction spinner(obj){ var radius,line,color,shadow; if( obj && obj.hasOwnProperty("shadow") ){ shadow = true; }else{ radius = 75; } if( obj && obj.hasOwnProperty("radius") ){ radius = obj.radius; }else{ radius = 75; } if( obj && obj.hasOwnProperty("line") ){ line = obj.line; }else{ line = 7; } var speed = {inc:0.04,loop:15}; if( obj && obj.hasOwnProperty("speed") ){ if( obj.speed == "slow" ){ speed = {inc:0.02,loop:25}; } } if( obj && obj.hasOwnProperty("color") ){ color = obj.color; }else{ color = '#3b749a'; } var canvas = document.getElementById('myCanvas'); canvas.style.height = 2*(radius+line) + "px"; canvas.style.width = 4*(radius+line) + "px"; var context = canvas.getContext('2d'); var startAngle,endAngle; var counterClockwise = false; var sa = 1.2; var ea = 0.85; var spinner = setInterval(function(){ canvas.width = canvas.width; sa += speed.inc; ea += speed.inc; startAngle = sa * Math.PI; endAngle = ea * Math.PI; showSpinner( startAngle, endAngle, counterClockwise, radius, line, context, color, shadow ); },speed.loop); setTimeout(function(){ clearInterval(spinner);},15000); return spinner; }spinner()Передайте аргумент, если хотите. Вы можете выбрать радиус, линию, цвет, тень и скорость.
var obj = {}; obj.line = int - the size in pixels of the line width obj.radius = int - the radius of the circle drawn (currently maxed at 75 for viewing, but you can always change the size of the canvas if you want) obj.color = string - the color that the line of the spinner will be obj.shadow = bool - show the shadow or don't show it obj.speed = string - Only supports "slow" right now. Otherwise it will be fast
Может быть, не очень элегантно:
var canvas = document.getElementById('myCanvas'); var context = canvas.getContext('2d'); var x = canvas.width / 2; var y = canvas.height / 2; var radius = 67.5; context.beginPath(); context.arc(x, y, radius, 0, 2.0 * Math.PI, false); context.lineWidth = 15; context.strokeStyle = '#3b749a'; context.stroke(); context.beginPath(); context.arc(x, y, radius, -Math.PI/2, Math.PI/2, false); var gradient = context.createLinearGradient(0, y-radius, 0, y+radius); gradient.addColorStop(0, '#3b749a'); gradient.addColorStop(0.5, '#FFFFFF'); gradient.addColorStop(1, '#3b749a'); context.lineWidth = 15; context.strokeStyle = gradient; context.stroke(gradient);
Comments