我已经使用 stackoverflow.com 作为灵感和解决问题的来源已有好几个月了。到目前为止,我从来没有遇到过没有解决方案的问题,这就是为什么我首先想在这里介绍一下自己,并与所有感兴趣的人分享我的问题。
在过去的几周里,我尝试在画布元素上对某些形状和线条进行动画处理,以创建一些有趣的效果 - 例如手写或类似效果。
为了实现这一点,我使用了一些技术,利用画布元素的 .clip() 命令来隐藏并逐渐显示预渲染图像(表格、线条...)“等待”的区域。 我在这里遇到的问题与确定画布元素中的剪切区域的变量有关。增加(但不减少)动画中的值似乎存在一些奇怪的问题。
由于这一切听起来很奇怪,我知道,这是我正在谈论的代码的相关部分。
$(document).ready(function() {
var ctx = $( "#canvas" )[0].getContext("2d");
ctx.fillStyle = "#a00";
var recW = 200;
function animate() {
ctx.clearRect(0,0,400,400);
ctx.beginPath();
ctx.rect(50,50,recW,100);
ctx.clip();
ctx.beginPath();
ctx.arc(250,100,90,0,Math.PI*2,true);
ctx.fill();
recW--;
if (recW == 150) clearInterval(run);
}
var run = setInterval(function() { animate(); },60);
});
上面的代码工作得很好。它在 400*400 的画布上绘制一个矩形,将其用作剪切区域,然后绘制圆形,然后相应地剪切该圆形。通过动画间隔,剪切矩形的长度减少到测试值 150。到目前为止,一切顺利。但这里出现了让我困惑了好几个小时的部分:
$(document).ready(function() {
var ctx = $( "#canvas" )[0].getContext("2d");
ctx.fillStyle = "#a00";
var recW = 150;
function animate() {
ctx.clearRect(0,0,400,400);
ctx.beginPath();
ctx.rect(50,50,recW,100);
ctx.clip();
ctx.beginPath();
ctx.arc(250,100,90,0,Math.PI*2,true);
ctx.fill();
recW++;
if (recW == 200) clearInterval(run);
}
var run = setInterval(function() { animate(); },60);
});
如果我翻转整个动画,从剪切矩形的宽度 150 开始,然后使用 recW++ 将其增加到测试值 200,突然动画不再起作用。变量的逐渐增加没有问题,但可见剪切区域不会增长。
我怀疑我可能只是忽略了这里明显的问题,但我似乎根本找不到错误,如果有人能指出我正确的方向,我将非常感激;)
非常感谢
特里康
I've used stackoverflow.com as a source of inspiration and problem-solving for many months now. I've just never run into a problem without a solution so far, which is the reason why I'd first like to introduce myself hereby, and to share my problem with everyone who's interested.
For the past couple of weeks I've tried animating certain shapes and lines on a canvas element, in order to create some interesting effects - such as handwriting or similar.
In order to achieve this, I use some technique which utilizes the .clip() command of the canvas element, to hide and gradually reveal areas under which a pre-rendered image (forms, lines...) "waits".
The problem I run into here, has to do with the variables which determine the clipping area in the canvas element. It seems to have some strange problem with increasing (but not decreasing) the values in the animation.
And since all this sounds very weird, which I am aware of, here is the relevant part of the code I am talking about.
$(document).ready(function() {
var ctx = $( "#canvas" )[0].getContext("2d");
ctx.fillStyle = "#a00";
var recW = 200;
function animate() {
ctx.clearRect(0,0,400,400);
ctx.beginPath();
ctx.rect(50,50,recW,100);
ctx.clip();
ctx.beginPath();
ctx.arc(250,100,90,0,Math.PI*2,true);
ctx.fill();
recW--;
if (recW == 150) clearInterval(run);
}
var run = setInterval(function() { animate(); },60);
});
The above code works perfectly fine. It draws a rectangle in a 400*400 canvas, uses it as a clipping region, draws the circle afterwards, and this circle is then clipped accordingly. Through the animation Interval, the length of the clipping-rectangle is then decreased to a test-value of 150. So far, so good. But here comes the part which has kept me riddled for hours on end:
$(document).ready(function() {
var ctx = $( "#canvas" )[0].getContext("2d");
ctx.fillStyle = "#a00";
var recW = 150;
function animate() {
ctx.clearRect(0,0,400,400);
ctx.beginPath();
ctx.rect(50,50,recW,100);
ctx.clip();
ctx.beginPath();
ctx.arc(250,100,90,0,Math.PI*2,true);
ctx.fill();
recW++;
if (recW == 200) clearInterval(run);
}
var run = setInterval(function() { animate(); },60);
});
If I turn the whole animation around, begin with a width of 150 for the clipping rectangle, and increase it with recW++ up to the test-value of 200, suddenly the animation does no longer work. The gradual increase of the variable works without problems, but the visible clipping area does not grow.
I suspect that I am perhaps just overlooking the obvious here, but I simply cannot seem to find the error and I'd be very thankful if somebody could point me into the right direction ;)
Thanks a lot
Tricon
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
除非您有丰富的经验(我也没有),否则您的问题很难调试。
您可以将形状设置为变小而不是变大的原因是,我怀疑您将剪辑组合在一起。因此,当它们变小时,一切看起来都很好,因为您期望最小的剪辑区域。然而,当剪辑变大时,您将与原始的小剪辑区域进行“与”操作,因此看起来没有动画。
要解决此问题,您需要在剪辑末尾调用
restore()
。但是,要使其正常工作,您还需要在剪辑的开头调用save()
。最后,我添加了一个边框框来指示剪辑的确切位置,并且由于这是填充和描边,因此我放置了另一个beginPath
语句,以不对剪辑区域之外的圆进行描边(我们将其刚刚恢复)。这是完整的 jsFiddle 代码
Your problem is a tricky one to debug unless you have a lot of experience (which I didn't either).
The reason you can animate the shape getting smaller and not it getting larger is because, I suspect, you are ANDing the clips together. Therefore, as they get smaller, everything looks fine since you are expecting the smallest clip area. When the clip is getting larger, however, you are ANDing with the original small clip area, so it appears like there is no animation.
To fix this you need to place a
restore()
call at the end of your clip. However, for this to work, you also need asave()
call at the beginning of your clip. Finally, I added a bordering box to indicate where the clip is exactly, and since this is a fill and a stroke, I placed anotherbeginPath
statement to not stroke the circle outside of the clip area (which we just restored from).Here is the full jsFiddle code
这是一个关于如何动画的很好的指南剪切路径。 您的问题是,一旦制作了剪辑,您必须将其拿走才能增长它,因此您使用保存状态和画布擦除来实现此效果。
这是一些示例代码。
Here is a nice guide on how to animate a clipping path. Your problem is that once the clip is made, you have to take it away in order to grow it, so you use save states and canvas wipes to make this effect.
Here is some example code.