【问题标题】:Circle(ARC) gradient fill with canvas JS圆形(ARC)渐变填充画布JS
【发布时间】:2023-05-15 01:18:01
【问题描述】:

我需要画一个动态的甜甜圈图——类似于——

http://194.90.28.56/~dev1/t.jpg

绿色部分表示百分比(在本例中为 27%) - 它必须是动态的。

我想我需要做一些类似的事情 - Android - How to draw an arc based gradient

但是用 JS..

谢谢。

【问题讨论】:

  • 没有足够的信息来提供帮助!

标签: javascript html canvas gradient geometry


【解决方案1】:

很好的问题。画布中沿路径的渐变很难。最简单的方法是捏造它。

不要将您的图像视为遵循圆形路径的渐变,而应将其视为两个线性渐变。

  • 一个在左侧,从绿色到灰色,从上到下。
  • 另一个在右侧,从白色到灰色,从上到下。

想象一个由这两个渐变组成的正方形:

现在想象一个圆穿过:

这就是你所要做的。

像这样“剪切”最容易使用剪辑区域,所以我做了一个例子。

下面是实际示例:http://jsfiddle.net/simonsarris/Msdkv/

代码如下!希望对您有所帮助。

var greenPart = ctx.createLinearGradient(0,0,0,100);
greenPart.addColorStop(0, 'palegreen');
greenPart.addColorStop(1, 'lightgray');

var whitePart = ctx.createLinearGradient(0,0,0,100);
whitePart.addColorStop(0, 'white');
whitePart.addColorStop(1, 'lightgray');


var width = 20;
ctx.lineWidth = width;

// First we make a clipping region for the left half
ctx.save();
ctx.beginPath();
ctx.rect(-width, -width, 50+width, 100 + width*2);
ctx.clip();

// Then we draw the left half
ctx.strokeStyle = greenPart;
ctx.beginPath();
ctx.arc(50,50,50,0,Math.PI*2, false);
ctx.stroke();

ctx.restore(); // restore clipping region to default

// Then we make a clipping region for the right half
ctx.save();
ctx.beginPath();
ctx.rect(50, -width, 50+width, 100 + width*2);
ctx.clip();

// Then we draw the right half
ctx.strokeStyle = whitePart;
ctx.beginPath();
ctx.arc(50,50,50,0,Math.PI*2, false);
ctx.stroke();

ctx.restore(); // restore clipping region to default

【讨论】:

  • 感谢您的回复。问题是这应该是一个甜甜圈图。绿色部分表示百分比。使用您的解决方案,将无法显示超过 50%(如果我错了,请纠正我..)。
  • 你是对的,我的解决方案在这种情况下不起作用。您能否更新您的问题,使其更具体?
  • 完成。谢谢,希望我能解决这个问题:)
  • 满足我需要的绝佳解决方案。 +1