<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>janily</title>
    <link>https://ruby-china.org/janily</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>使用 SVG 来制作 Morphing 动画效果</title>
      <description>&lt;h3 id="何为Morphing动画"&gt;何为 Morphing 动画&lt;/h3&gt;
&lt;p&gt;开始之前，先来了解下什么是 Morphing 动画。所谓 Morphing 动画是表示，同一个模型，从一个形状变到另一个形状。如下图所示，从形状 1 渐变到形状 2，再从形状 2 渐变到形状 3，最后从形状 3 渐变到形状 1，以此循环往复。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i2.buimg.com/567571/80fb7cd1de3afec1.gif" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;从上图可以看到像这样的 Morphing 动画简直是为 SVG 量身定制的，因为 SVG 中的路径原本就是由很多的坐标点构成的（点连成线），做一些形状变化只要移动坐标点就可以了。&lt;/p&gt;

&lt;p&gt;简单的来说，在 SVG 要实现 Morphing 动画，主要是靠移动形状路径上的坐标点从而达到从一个形状变到另一个形状的动画效果。并且由于这个形状是从一个形状变化而来，所以路径上的坐标数量要完全相同，不同的只是坐标的位置不同而已。&lt;/p&gt;
&lt;h3 id="如何制作Morphing动画"&gt;如何制作 Morphing 动画&lt;/h3&gt;
&lt;p&gt;要制作 Morphing 动画，首先得用矢量编辑软件比如 Adobe Illustrator 或者是 Inscape 来设计好相关的形状并得到相关路径（path）的数据信息。&lt;/p&gt;

&lt;p&gt;比如，如果你要做如下图所示的两个形状之间变化的 Morphing 动画，就需要在设计软件中先设计好两个形状。当然这里要注意一点的事是，两个图形的坐标数量要一样，只是位置不同而已。了解
Adobe Illustrator 的应该会明白，一般在设计好基本的形状的时候，使用贝赛尔曲线工具，可以做很多的变化，从而使用一个基本的形状可以做出不同形状的变化。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i2.buimg.com/567571/a8cc448256e1e1ac.gif" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="实战Morphing动画"&gt;实战 Morphing 动画&lt;/h3&gt;
&lt;p&gt;下面我们来小小的练习一下，实现上图中的效果。&lt;/p&gt;

&lt;p&gt;首先在设计软件中，这里使用的是 Adobe Illustrator 来设计一个基本的形状，如下图所示：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i2.buimg.com/567571/4a9cdf493fd560af.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;然后复制一份新建一个文档，在它基础上使用贝赛尔曲线工具，稍微对几个坐标点做下变化得到下面的图形：&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i2.buimg.com/567571/031f5ad8f4050a06.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这就得到了两个矢量图形，然后分别导出 SVG 格式，得到 Path 的信息：&lt;/p&gt;
&lt;h4 id="path1"&gt;&lt;strong&gt;path1&lt;/strong&gt;&lt;/h4&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;path d="M200,51.75A51.75,51.75,0,0,0,99.2,35.27a83,83,0,1,0,65.13,65.67A51.76,51.76,0,0,0,200,51.75Z" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="path2"&gt;&lt;strong&gt;path2&lt;/strong&gt;&lt;/h4&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;path d="M140,51.75A51.75,51.75,0,0,0,99.2,35.27a83,83,0,1,0,65.13,65.67A51.76,51.76,0,0,0,140,51.75Z" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到 path 信息之后，接下来就是来实现动画效果来。&lt;/p&gt;

&lt;p&gt;这里我们需要借助于一个小小的轻量级的 js 动画库&lt;a href="https://github.com/juliangarnier/anime" rel="nofollow" target="_blank" title=""&gt;anime&lt;/a&gt;，这个库非常的小，而且没有任何的依赖，才几百行。是一款功能强大的 Javascript 动画库插件。anime.js 可以和 CSS3 属性，SVG，DOM 元素和 JS 对象一起工作，制作出各种高性能，平滑过渡的动画效果。&lt;/p&gt;

&lt;p&gt;具体的使用方法就不详细介绍，可以去&lt;a href="https://github.com/juliangarnier/anime" rel="nofollow" target="_blank" title=""&gt;官网&lt;/a&gt;看相关实例。&lt;/p&gt;

&lt;p&gt;下面就针对 SVG 来介绍下使用&lt;strong&gt;anime&lt;/strong&gt;来实现 Morphing 动画。根据 Morphing 动画原理，我们现在是要实现从&lt;strong&gt;path1&lt;/strong&gt;形状平滑的过度到&lt;strong&gt;path2&lt;/strong&gt;的动画效果。&lt;/p&gt;
&lt;h4 id="anime api"&gt;&lt;strong&gt;anime api&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;获取目标元素&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;在&lt;strong&gt;anime&lt;/strong&gt;中要来编写动画效果，首先是选择你要运动的元素，这里使用浏览器默认的方法来得到目标元素：&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;选择器&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOM 元素&lt;/td&gt;
&lt;td&gt;document.getElementsByTagName("path")[0]]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这里简单介绍下，我们将要使用的一些参数&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;名字&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delay(动画延迟)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;数字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;duration(动画运行时间)&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;数字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autoplay(是否自动开始)&lt;/td&gt;
&lt;td&gt;ture&lt;/td&gt;
&lt;td&gt;布尔值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;easing(缓动曲线)&lt;/td&gt;
&lt;td&gt;easeOutElastic&lt;/td&gt;
&lt;td&gt;使用 console log anime.easings 可以输出它支持的一些欢动曲线方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop(是否循环播放)&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;布尔值或者是具体的整数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;具体到我们这个效果，其实我们要改变的就是 SVG 中 Path 路径的值，使用 anime 结合上面介绍的方法可以很轻松的来实现这个效果，如下代码所示：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anime({
  targets: [document.getElementsByTagName("path")[0]],
  d: "M140,51.75A51.75,51.75,0,0,0,99.2,35.27a83,83,0,1,0,65.13,65.67A51.76,51.76,0,0,0,140,51.75Z",
  duration: 1000,
  loop: true,
  direction: "alternate",
  easing: "linear"
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的代码中，&lt;strong&gt;d&lt;/strong&gt;就是我们要改变的属性的值。这里注意下&lt;strong&gt;duration&lt;/strong&gt;这个参数，它是用来指定动画运行的方向的，主要是三个值&lt;strong&gt;normal&lt;/strong&gt;、&lt;strong&gt;reverse&lt;/strong&gt;和&lt;strong&gt;alternate&lt;/strong&gt;，这里选择是&lt;strong&gt;alternate&lt;/strong&gt;即动画动画轮流反向播放。&lt;/p&gt;

&lt;p&gt;OK，就这么简单我们就实现了一个简单 Morphing 动画。充分发挥你的想象力，我们可以实现更有趣的 Morphing 动画。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://i2.buimg.com/567571/a8cc448256e1e1ac.gif" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;最近做了一个关于 SVG 的应用的技术分享网站&lt;a href="http://svgtrick.com/" rel="nofollow" target="_blank" title=""&gt;svgtrick.com&lt;/a&gt;，会同步一些文章到这里来，更多的关于 SVG 方面的技术知识可以去&lt;a href="http://svgtrick.com/" rel="nofollow" target="_blank" title=""&gt;网站&lt;/a&gt;看看。&lt;/p&gt;</description>
      <author>janily</author>
      <pubDate>Mon, 19 Sep 2016 12:46:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/31089</link>
      <guid>https://ruby-china.org/topics/31089</guid>
    </item>
    <item>
      <title>ArgumentError in Static_pages#home</title>
      <description>&lt;p&gt;这段时间在看 Ruby on Rails Tutorial 这本书在学习 rails，今天在照第五章的例子做的时候，报错
如图所示
&lt;img src="//l.ruby-china.com/photo/5bcad7bc7ffb7e830884f5e6b73e5d1d.png" title="" alt=""&gt;
不是道是啥原因
还请各位解答一下，谢谢~~！&lt;/p&gt;</description>
      <author>janily</author>
      <pubDate>Fri, 14 Jun 2013 11:09:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/11716</link>
      <guid>https://ruby-china.org/topics/11716</guid>
    </item>
  </channel>
</rss>
