【问题标题】:Animated canvas arc with easing带缓动的动画画布弧
【发布时间】:2011-11-19 20:56:13
【问题描述】:

我正在画布上绘制一个非传统的时钟。时间由秒环、秒针、分钟环和小时环表示。我正在使用 webkit/mozRequestAnimationFrame 在适当的时间进行绘制。我想修改第二个环以快速动画到下一秒(125ms - 250ms)并使用二次缓动(而不是那个可怕的快照)。

与 Raphael JS Clock 的第二个圆环非常相似,只是它使用不同的缓动:http://raphaeljs.com/polar-clock.html

JS Fiddle 链接(必须在 Chrome、Firefox 或 Webkit Nightly 中查看):

  1. 小提琴:http://jsfiddle.net/thecrypticace/qmwJx/

  2. 全屏小提琴: http://jsfiddle.net/thecrypticace/qmwJx/embedded/result/

任何帮助将不胜感激!

这很接近,但仍然很生涩:

var startValue;
if (milliseconds < 500) {
    if (!startValue) startValue = milliseconds;
    if (milliseconds - startValue <= 125) {
        animatedSeconds = seconds - 0.5 + Math.easeIn(milliseconds - startValue, startValue, 1000 - startValue, 125)/1000;
    } else {
        animatedSeconds = seconds;
    }
    drawRing(384, 384, 384, 20, animatedSeconds / 60, 3 / 2 * Math.PI, false);
} else {
    drawRing(384, 384, 384, 20, seconds / 60, 3 / 2 * Math.PI, false);        
    startValue = 0;
}

【问题讨论】:

  • ...帮助什么? ;-)。你应该在这里拼出你的问题,而不仅仅是链接到小提琴......
  • 我在这里说过:“修改第二个环以动画...而不是捕捉...”基本上我只想将动画添加到第二个环,而不是只显示下一个价值,它的动画效果很好。

标签: html animation canvas clock easing


【解决方案1】:

这是一门数学课:

drawRing(384, 384, 384, 20, seconds / 60, 3 / 2 * Math.PI, false);

这是绘制秒圈的线。所以问题是,在任何给定的时刻,你都会有 34/60、35/60 之类的东西。这意味着您的秒圈是 60/60,因此不使用毫秒,而是每秒绘制一次。

线性缓动解决方案:使您的秒数循环 60 000 / 60 000 -> 60 秒,每次 1000 毫秒。还有数学:

drawRing(384, 384, 384, 20, ((seconds*1000)+milliseconds) / 60000, 3 / 2 * Math.PI, false);

In Out Quadric 解决方案或选择一个these

Math.easeInOutQuad = function (t, b, c, d) {
    t /= d/2;
    if (t < 1) return c/2*t*t + b;
    t--;
    return -c/2 * (t*(t-2) - 1) + b;
};

我优化并更改了您的代码:

//+1 animation happens before the second hand
//-1 animation happens after the second hand
animatedSeconds = seconds+1;
if (milliseconds > 10) {
    if (!startValue) { startValue = milliseconds; }
    if (milliseconds - startValue <= 100) {
        animatedSeconds -= -0.5+ Math.easeInOutQuad(milliseconds - startValue, startValue, 1000 - startValue, 125) / 1000;
    }
} else {
    startValue = 0;
}
drawRing(384, 384, 384, 20, animatedSeconds / 60, 3 / 2 * Math.PI, false);

希望这是您正在寻找的。​​p>

【讨论】:

  • 这接近我想要的。但是,我已经在为二手做这件事了。此外,它不是每毫秒重绘一次,谷歌 requestAnimationFrame 找出原因(浏览器控制动画循环)。我的问题是我需要为第二个环设置动画,类似于 Raphael JS Polar Clock 示例。从一秒到一秒,它都有一个快速动画,不到一秒就可以完成,在环上绘制下一秒。
  • 添加了一些我尝试过的东西,它很接近,但并不完全,因为动画真的很生涩。还使用新代码更新了 JS Fiddle 示例。
  • 这非常接近,但有几次它从一个完整的圆圈跳到正确的值(半重复)。但是,这非常接近,我会看看我明天是否无法根据此计算出数学。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2013-11-25
  • 2019-05-08
  • 2018-11-03
  • 2023-03-22
  • 2017-08-30
相关资源
最近更新 更多