【问题标题】:Animating canvas' .stroke() without external libraries没有外部库的动画画布' .stroke()
【发布时间】:2014-10-21 21:17:54
【问题描述】:

我知道它被问了很多(我用谷歌搜索过),但是如何在画布上为 .stroke() 命令制作动画?我找到了一些示例,但它们都依赖于外部强大的(出于我的目的)库或需要使用预先生成的 SVG 文件。
我有这个页面here(我知道这很糟糕,但我正在学习曲线)。我需要的是使底部“按钮”的线条“增长”或具有至少类似于其他按钮提供的圆形效果。对于圆圈,我使用 jquery 的旋钮库,但对于线条......感觉这可以通过转换或其他东西来完成,但我不能把手指放在它上面。有什么建议吗?

【问题讨论】:

  • 请在此处添加有意义的代码和问题描述。不要只链接到需要修复的站点 - 否则,一旦问题得到解决,这个问题将对未来的访问者失去任何价值。发布证明您的问题的Short, Self Contained, Correct Example (SSCCE) 将帮助您获得更好的答案。有关详细信息,请参阅 Something on my web site doesn't work. Can I just paste a link to it? 谢谢!
  • 我相信我确实解释了我需要的东西(实际上这个主题本身非常不言自明)......而且我不相信我要求“修复”一个“损坏”的网站。至少我的网站没有损坏
  • 您发布了指向与此问题相关的网站的链接。如果该链接脱机,则该问题将失去所有价值。

标签: javascript jquery html canvas


【解决方案1】:

有几种方法可以做到这一点,但最简单(和本机)的方法不需要太多代码。这是canvas stroke() 动画的WORKING FIDDLE。随附的 JavaScript 如下。这是一个非常简单的例子,但它应该给你正确的想法。

var canvasObj = function() {

  var canvas = document.getElementById('canvas'),
      ctx = canvas.getContext('2d'),
      x = 0,
      y = 0,

      animate = function() {

        ctx.beginPath();
        ctx.moveTo( 0, 0 );
        ctx.lineTo( x,y );
        ctx.stroke();

        x += 5;
        y += 2.5;

        setTimeout( animate, 200 );
      };


  return {
    'animate': animate
  };

};

解释:使这项工作发挥作用的是closure,它由canvasObj 函数中的内部函数animate 创建。变量xy 在父函数级别可用,并且可以由animate 函数操作。 animate 通过使用 setTimeout 调用自己,创建动画效果。就是这样。希望这可以帮助您顺利上路。

【讨论】:

  • 我一直在想这个方向,但有人告诉我,需要计算每个点的精确位置才能实现流畅的动画......我今天会试试这个,让你知道它是否确实实现了什么我需要。
  • 最后我决定像这样var timerId = setInterval(function() { context.beginPath(); context.moveTo(x1min, y1min); context.lineTo(x1cur, y1cur); context.lineWidth = "5"; context.strokeStyle = "#87CEEB"; context.lineCap = "round"; context.stroke(); x1cur -= 8.7 y1cur += 3 if (y1cur == y1max) { clearInterval(timerId); } }, 50); 使用setInterval 仍然在玩增长速度,但我想这个想法是可以理解的。将您的帖子标记为“答案”
猜你喜欢
  • 2018-02-02
  • 2020-01-17
  • 2013-09-30
  • 1970-01-01
  • 2019-04-28
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
相关资源
最近更新 更多