【问题标题】:How do you animate an SVG path in IOS?如何在 IOS 中为 SVG 路径设置动画?
【发布时间】:2011-08-20 22:07:02
【问题描述】:

我有一个像这样的 SVG 路径:

<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" version="1.1"  baseProfile="full"> 
    <path d="M47.16,66.38c0.62,1.65-0.03,2.93-0.92,4.28c-5.17,7.8-8.02,11.38-14.99,18.84c-2.11,2.25-1.5,4.18,2,3.75c7.35-0.91,28.19-5.83,40.16-7.95" style="fill:none;stroke:black;stroke-width:2" />
</svg>

我可以渲染路径,但似乎无法找到使路径具有动画效果的方法,以使其看起来像用铅笔一样“被绘制”。 animate 节点适用于单个坐标,但不适用于路径。

我最终将在 iPhone 应用程序中使用解析器或 UIWebView 使用此动画。

【问题讨论】:

标签: ios animation svg


【解决方案1】:

我尝试了很长时间,而不必在标题中添加额外的脚本(我不知道 javascript 没有帮助),所以这是解决方案:

<path d="..." stroke-dasharray="">
  <animate attributeName="stroke-dashoffset" from="" to="0" dur="1s" begin="0s"
           onload="var length = parentNode.getTotalLength();
                   parentNode.setAttribute('stroke-dasharray',length+','+length);
                   this.setAttribute('from',length)" />
</path>

为了便于阅读,我在此处添加了额外的换行符。

这在 SVG 中是合法的(虽然在 HTML 中不合法),因为 the svg:animate element allows onload,而大多数 HTML 元素不这样做。

【讨论】:

    【解决方案2】:

    渲染 SVG 路径后,为了让它看起来像是用铅笔绘制的,您可以简单地用一个不透明的层覆盖它,然后为该层沿路径的移动设置动画。

    要找到CGPath,您可以沿着它移动图层,您可以使用这个库: https://github.com/arielelkin/PocketSVG

    这会将 SVG 数据解析为 UIBezierPath。那么:

    SvgToBezier *myBezier = [[SvgToBezier alloc] initFromSVGPathNodeDAttr:@"M176.17,369.617c0,0,335.106-189.361,214.894,38.298s129.787,282.978,178.723,42.553C618.724,210.042,834.681,87.702,790,307.915" rect:CGRectMake(0,0,1024,768)];
    
    UIBezierPath *myPath = myBezier.bezier;
    
    CAKeyframeAnimation *mySVGPathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    bounceAnimLeft.duration = 3;
    bounceAnimLeft.path = myPath.CGPath;
    
    [myObjectToMove.layer addAnimation:mySVGPathAnimation forKey:@"pathAnimation"];
    

    【讨论】:

    • 您能否进一步解释一下如何使用您的代码?
    • 如果您的路径在 SVG 中,并且您想在看起来像是被绘制的地方制作动画,您首先需要使用我上面发布的代码将 SVG 转换为 CGPath。一旦你有了 CGPath,看看这个:oleb.net/blog/2010/12/…
    【解决方案3】:

    尝试为'stroke-dashoffset' 设置动画(请注意,您需要与之匹配的'stroke-dasharray'),请参阅this example。需要计算才能成功使用它的路径长度可以通过如下脚本获取:

    var pathlength = yourPathElm.getTotalLength()
    

    example 上查看源代码以了解它是如何完成的。

    【讨论】:

    • 非常好的例子,谢谢!我一直在研究您的示例,仅隔离仅适用于一笔的元素。我几乎就在那里,除了我想不出几件事:1) 为什么如果我从您的&lt;g&gt; 节点中删除translate,我什么都看不到? 2) 为什么在stroke-dasharray 的样式声明中重复 54 ​​两次?
    • 1) 因为路径是用该偏移量定义的(快速 inkscape hack)。您可以将转换应用于路径“d”属性并将其从“g”元素中删除。 2)仅仅因为我认为它更清楚,它在破折号长度和间隙长度之间交替,但如果它们相同,确实可以只指定一个数字(浏览器会将它们扩展为偶数个破折号/间隙)见w3.org/TR/SVG11/painting.html#StrokeDasharrayProperty
    • 太棒了!非常感谢!
    • 我想知道我的路径内确实有移动,这确实重置了破折号笔划。有没有办法绕过它? (stretchsketch.com/animate.svg)
    • @rajkamal: begin="rect.click" 表示每当点击 id 为“rect”的元素时触发动画,参见w3.org/TR/SVG11/animate.html#SyncbaseValueSyntax
    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2018-08-26
    • 2017-09-29
    • 2021-07-25
    • 2021-07-20
    • 2012-07-14
    相关资源
    最近更新 更多