javascript - HTML Canvas 渐变仅显示一种颜色

标签 javascript html5-canvas linear-gradients

我在使用 Canvas 渐变时遇到问题,它仅显示我在 gradient.__addColorStop__(offset,color) 方法中设置的最后一个颜色。

例如,这是我的一段代码,以便更好地理解:

let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
let gradient = ctx.createLinearGradient(10, 90, 200, 90);
gradient.addColorStop(1 / 10, "black");
gradient.addColorStop(1 / 5, "yellow");
gradient.addColorStop(1 / 1, "red");
let circle1 = new Circle(300, 250, 50, gradient);
circle1.draw(ctx);

该代码仅绘制一个红色圆圈,并对任何填充渐变的形状执行相同的操作,如果我注释此行gradient.addColorStop(1/1,"red");然后 Canvas 绘制黄色圆圈,只读取最后一种颜色。我在 jsfiddle.net 上尝试了相同的代码并且运行良好,我不知道为什么我的脚本不起作用。

PD:Circle是我定义的一个js对象,并且工作完美

抱歉我的英语不好,如果这篇文章不明白请告诉我,这是我在 StackOverflow 上的第一篇文章。 谢谢!

最佳答案

CanvasGradients 与上下文的变换矩阵相关,而不是与您要填充的形状相关。

因此,在您的示例中,由于您正在绘制水平渐变,因此您仅在从 x:10 到 x:200 的区域中设置此渐变。 x:10 之前的像素将具有索引 0 处的值,x:200 之后的像素将具有索引 1 处的值。
由于您在 300,150 处绘制半径为 50 的圆,因此您的圆将达到的最小 x 位置为 250,即在梯度索引:1 之后,因此为纯红色。

这是所发生情况的视觉演示:

let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
let gradient = ctx.createLinearGradient(10, 90, 200, 90);
gradient.addColorStop(1 / 10, "black");
gradient.addColorStop(1 / 5, "yellow");
gradient.addColorStop(1 / 1, "red");

// draw a full rectangle to see how the gradient is actually rendered
ctx.fillStyle = gradient;
ctx.fillRect(0,0,canvas.width,canvas.height);

ctx.beginPath();
ctx.arc(300, 150, 50, 0, Math.PI*2);
ctx.strokeStyle = 'white';
ctx.stroke();
<canvas id="canvas" width="500" height="300"></canvas>

要避免此问题,您有两种方法:

  • 在正确的坐标处生成 CanvasGradient:

let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
// x1 & x2 are set to match the circle's position
let gradient = ctx.createLinearGradient(250, 90, 350, 90);
gradient.addColorStop(1 / 10, "black");
gradient.addColorStop(1 / 5, "yellow");
gradient.addColorStop(1 / 1, "red");

ctx.fillStyle = gradient;

ctx.beginPath();
ctx.arc(300, 150, 50, 0, Math.PI*2);
ctx.fill();
<canvas id="canvas" width="500" height="300"></canvas>

  • 修改上下文的变换矩阵以移动 CanvasGradient:

let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
let gradient = ctx.createLinearGradient(10, 90, 200, 90);
gradient.addColorStop(1 / 10, "black");
gradient.addColorStop(1 / 5, "yellow");
gradient.addColorStop(1 / 1, "red");

ctx.fillStyle = gradient;

ctx.beginPath();
ctx.arc(300, 150, 50, 0, Math.PI*2);
// our arc has been defined at the correct position
// we can now translate the context matrix so that only the fillStyle be moved
ctx.translate(230, 0);
ctx.fill();

// reset the default tranform matrix
ctx.setTransform(1,0,0,1,0,0);
<canvas id="canvas" width="500" height="300"></canvas>

关于javascript - HTML Canvas 渐变仅显示一种颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52307462/

相关文章:

javascript - 如何从 JSON 文件获取 JSON 数据

javascript - Canvas 和 requestAnimationFrame 的高 CPU 使用率

css - 仅将线性渐变动画应用于网格/网格叠加层

css - 六边形 CSS 背景

javascript - doctype 和 onclick 事件

javascript - 在 sweetalert Ok 弹出窗口后刷新当前页面

javascript - 未捕获的类型错误 : $(. ..).slider 不是 Bootstrap-Slider-Rails 的函数

html - Canvas 上的绘制是否基于现有内容进行了优化?

html - 达特,为什么我的形状不显示?

HTML/CSS - 两个具有单一渐变背景但有一个粘性元素的 div