KonvaJs:带有角度渐变的环

时间:2015-12-30 18:14:06

标签: javascript canvas kineticjs gradient konvajs

我在我的项目中使用KonvaJS。我需要用角度渐变制作圆环或圆弧。它在fiddle中完成的方式。我使用了像Konva.Arc这样的小提琴中使用的颜色

fillRadialGradientStartPoint: 0,
fillRadialGradientStartRadius: 35,
fillRadialGradientEndPoint: 0,
fillRadialGradientEndRadius: 55,
fillRadialGradientColorStops: [0, '#0F0', 1.0, '#0FF', 0, '#F00', 1.0, '#FF0', 0, '#F0F', 1.0, '#00F']

但我不知道自己错过了什么。我不能给它一样的外观。这是plunkr。在plunkr中,我使用了自定义形状。使用自定义形状,我能够绘制角度渐变的环,但我不想使用自定义形状因为如果我使用自定义形状,那么我也必须照顾其他东西,因为Konva已经有两个内置形状Konva.RingKonva.Arc。所以最好使用它们。

Expected ring

1 个答案:

答案 0 :(得分:2)

Konva.Image可以使用html5画布作为其图像源。

这意味着你可以:

  1. 创建一个包含arc-gradient的内存中画布(使用与your linked fiddle相同的代码)。
  2. 使用#1中的画布作为图像源创建一个Konva.Image。
  3. 以下是示例代码和演示:

    var stage = new Konva.Stage({
      container: 'container',
      width: 350,
      height: 350
    });
    var layer = new Konva.Layer();
    stage.add(layer);
    
    // create arc gradient on an in-memory canvas
    var r=120;
    var lw=30;
    var c=drawMultiRadiantCircle(r,lw,['#0F0','#0FF','#F00','#FF0','#F0F']);
    
    // use the in-memory canvas as an image source for Konva.Image
    var img=new Konva.Image({x:0,y:0,image:c,width:c.width,height:c.height,draggable:true});
    layer.add(img);
    layer.draw();
    
    
    // helper function: return a new canvas containing an arc-gradient
    function drawMultiRadiantCircle(r, linewidth, radientColors) {
      var xc=r+linewidth/2;
      var yc=r+linewidth/2;
      var canvas = document.createElement("canvas");
      var ctx = canvas.getContext("2d");
      canvas.width=r*2+linewidth;
      canvas.height=r*2+linewidth;
      var partLength = (2 * Math.PI) / radientColors.length;
      var start = 0;
      var gradient = null;
      var startColor = null;
      var endColor = null;
      //
      for (var i = 0; i < radientColors.length; i++) {
        startColor = radientColors[i];
        endColor = radientColors[(i + 1) % radientColors.length];
        // x start / end of the next arc to draw
        var xStart = xc + Math.cos(start) * r;
        var xEnd = xc + Math.cos(start + partLength) * r;
        // y start / end of the next arc to draw
        var yStart = yc + Math.sin(start) * r;
        var yEnd = yc + Math.sin(start + partLength) * r;
        gradient = ctx.createLinearGradient(xStart, yStart, xEnd, yEnd);
        gradient.addColorStop(0, startColor);
        gradient.addColorStop(1.0, endColor);
        //
        ctx.beginPath();
        ctx.strokeStyle = gradient;
        ctx.arc(xc, yc, r, start, start + partLength);
        ctx.lineWidth = linewidth;
        ctx.stroke();
        ctx.closePath();
        start += partLength;
      }
      return(canvas);
    }
    body{padding:20px;}
    #container{
      border:solid 1px #ccc;
      margin-top: 10px;
      width:350px;
      height:350px;
    }
    <script src="https://cdn.rawgit.com/konvajs/konva/0.9.0/konva.min.js"></script>
    <h4>A draggable Konva.Image created from an html5 canvas.</h4>
    <div id="container"></div>