【发布时间】:2011-06-05 14:03:25
【问题描述】:
如何将矢量路径设置为动画,就像它正在被绘制一样,渐进式的?换句话说,逐个像素地慢慢显示路径。
我正在使用Raphaël.js,但是如果你的答案不是特定于库的——比如可能有一些通用的编程模式可以做这种事情(我对矢量动画还很陌生) ——不客气!
使用直线路径很容易,就像 that page:: 上的示例一样简单。
path("M114 253").animate({path: "M114 253 L 234 253"});
但是尝试更改该页面上的代码,比如说,这样::
path("M114 26").animate({path: "M114 26 C 24 23 234 253 234 253"});
你会明白我的意思。路径肯定是从它的初始状态(点“M114 26”)到结束状态(曲线“C 24 23 234 253 234 253”从点“M114 26”开始)动画,但不是以问题中指定的方式,不像它正在绘制中。
我不明白animateAlong 是如何做到这一点的。它可以沿路径为对象设置动画,但是如何使该路径在对象沿其设置动画时逐渐显示出来?
解决办法?
(通过peteorpeter's answer。)
似乎目前最好的方法是通过使用原始 SVG 的“假”破折号。解释见this demo或this document,第4页。
如何产生渐进图?
我们必须使用
stroke-dasharray和stroke-dashoffset并且知道要绘制的曲线的长度。 此代码不会在屏幕上绘制圆形、椭圆、折线、多边形或路径:<[element] style="stroke-dasharray:[curve_length],[curve_length]; stroke-dashoffset:[curve_length]"/>如果在动画元素中 stroke-dashoffset 减小到 0,我们就得到了渐进式的曲线绘制。
<circle cx="200" cy="200" r="115" style="fill:none; stroke:blue; stroke-dasharray:723,723; stroke-dashoffset:723"> <animate begin="0" attributeName="stroke-dashoffset" from="723" to="0" dur="5s" fill="freeze"/> </circle>
如果你知道更好的方法,请留下答案。
更新(2012 年 4 月 26 日):找到一个很好地说明这个想法的例子,请参阅 Animated Bézier Curves。
【问题讨论】:
标签: javascript animation vector svg bezier