@antv/g6
Version:
graph visualization frame work
1 lines • 116 kB
JSON
{"expireTime":9007200828528711000,"key":"transformer-remark-markdown-ast-eb42fb13271e44fd67900b7c24af559b-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":{"type":"root","children":[{"type":"paragraph","children":[{"type":"text","value":"G6 中的动画分为两个层次:","position":{"start":{"line":2,"column":1,"offset":1},"end":{"line":2,"column":15,"offset":15},"indent":[]}}],"position":{"start":{"line":2,"column":1,"offset":1},"end":{"line":2,"column":15,"offset":15},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"全局动画:全局性的动画,图整体变化时的动画过渡;","position":{"start":{"line":4,"column":3,"offset":19},"end":{"line":4,"column":27,"offset":43},"indent":[]}}],"position":{"start":{"line":4,"column":3,"offset":19},"end":{"line":4,"column":27,"offset":43},"indent":[]}}],"position":{"start":{"line":4,"column":1,"offset":17},"end":{"line":4,"column":27,"offset":43},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"元素(边和节点)动画:节点或边上的独立动画。","position":{"start":{"line":5,"column":3,"offset":46},"end":{"line":5,"column":25,"offset":68},"indent":[]}}],"position":{"start":{"line":5,"column":3,"offset":46},"end":{"line":5,"column":25,"offset":68},"indent":[]}}],"position":{"start":{"line":5,"column":1,"offset":44},"end":{"line":5,"column":25,"offset":68},"indent":[]}}],"position":{"start":{"line":4,"column":1,"offset":17},"end":{"line":5,"column":25,"offset":68},"indent":[1]}},{"type":"html","value":"<br />\n## 全局动画\nG6 的全局动画指通过图实例进行某些全局操作时,产生的动画效果。例如:","position":{"start":{"line":7,"column":1,"offset":70},"end":{"line":9,"column":36,"offset":120},"indent":[1,1]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"html","value":"<code class=\"language-text\">graph.updateLayout(cfg)</code>","position":{"start":{"line":11,"column":3,"offset":124},"end":{"line":11,"column":28,"offset":149},"indent":[]}},{"type":"text","value":" 布局的变化","position":{"start":{"line":11,"column":28,"offset":149},"end":{"line":11,"column":34,"offset":155},"indent":[]}}],"position":{"start":{"line":11,"column":3,"offset":124},"end":{"line":11,"column":34,"offset":155},"indent":[]}}],"position":{"start":{"line":11,"column":1,"offset":122},"end":{"line":11,"column":34,"offset":155},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"html","value":"<code class=\"language-text\">graph.changeData()</code>","position":{"start":{"line":12,"column":3,"offset":158},"end":{"line":12,"column":23,"offset":178},"indent":[]}},{"type":"text","value":" 数据的变化","position":{"start":{"line":12,"column":23,"offset":178},"end":{"line":12,"column":29,"offset":184},"indent":[]}}],"position":{"start":{"line":12,"column":3,"offset":158},"end":{"line":12,"column":29,"offset":184},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":156},"end":{"line":12,"column":29,"offset":184},"indent":[]}}],"position":{"start":{"line":11,"column":1,"offset":122},"end":{"line":12,"column":29,"offset":184},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"通过实例化图时配置 ","position":{"start":{"line":14,"column":1,"offset":186},"end":{"line":14,"column":11,"offset":196},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">animate: true</code>","position":{"start":{"line":14,"column":11,"offset":196},"end":{"line":14,"column":26,"offset":211},"indent":[]}},{"type":"text","value":",可以达到每次进行上述操作时,动画效果变化的目的。配合 ","position":{"start":{"line":14,"column":26,"offset":211},"end":{"line":14,"column":54,"offset":239},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">animateCfg</code>","position":{"start":{"line":14,"column":54,"offset":239},"end":{"line":14,"column":66,"offset":251},"indent":[]}},{"type":"text","value":" 配置动画参数:","position":{"start":{"line":14,"column":66,"offset":251},"end":{"line":14,"column":74,"offset":259},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":14,"column":74,"offset":259},"end":{"line":14,"column":80,"offset":265},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":186},"end":{"line":14,"column":80,"offset":265},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> graph <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">G6<span class=\"token punctuation\">.</span>Graph</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// ... // 图的其他配置项</span>\n animate<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// Boolean,切换布局时是否使用动画过度,默认为 false</span>\n animateCfg<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n duration<span class=\"token punctuation\">:</span> <span class=\"token number\">500</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// Number,一次动画的时长</span>\n easing<span class=\"token punctuation\">:</span> <span class=\"token string\">'linearEasing'</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// String,动画函数,可选项:''</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre></div>","position":{"start":{"line":15,"column":1,"offset":266},"end":{"line":24,"column":4,"offset":530},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"link","url":"#easing-函数","title":null,"children":[],"data":{"hProperties":{"aria-label":"easing 函数 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"easing 函数","position":{"start":{"line":26,"column":5,"offset":536},"end":{"line":26,"column":14,"offset":545},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":532},"end":{"line":26,"column":14,"offset":545},"indent":[]},"data":{"id":"easing-函数","htmlAttributes":{"id":"easing-函数"},"hProperties":{"id":"easing-函数"}}},{"type":"paragraph","children":[{"type":"text","value":"easing 函数是指动画的函数。例如线性插值、先快后慢等。","position":{"start":{"line":27,"column":1,"offset":546},"end":{"line":27,"column":31,"offset":576},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":27,"column":31,"offset":576},"end":{"line":27,"column":37,"offset":582},"indent":[]}},{"type":"text","value":"G6 支持所有 d3 中的动画函数。因此,上面代码中 ","position":{"start":{"line":27,"column":37,"offset":582},"end":{"line":27,"column":64,"offset":609},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">animateCfg</code>","position":{"start":{"line":27,"column":64,"offset":609},"end":{"line":27,"column":76,"offset":621},"indent":[]}},{"type":"text","value":" 配置中的 String 类型的 ","position":{"start":{"line":27,"column":76,"offset":621},"end":{"line":27,"column":93,"offset":638},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">easing</code>","position":{"start":{"line":27,"column":93,"offset":638},"end":{"line":27,"column":101,"offset":646},"indent":[]}},{"type":"text","value":" 可以取值有:","position":{"start":{"line":27,"column":101,"offset":646},"end":{"line":27,"column":108,"offset":653},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":27,"column":108,"offset":653},"end":{"line":27,"column":114,"offset":659},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'easeLinear'</code>","position":{"start":{"line":27,"column":114,"offset":659},"end":{"line":27,"column":128,"offset":673},"indent":[]}},{"type":"text","value":" ,","position":{"start":{"line":27,"column":128,"offset":673},"end":{"line":27,"column":130,"offset":675},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":27,"column":130,"offset":675},"end":{"line":27,"column":136,"offset":681},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'easePolyIn'</code>","position":{"start":{"line":27,"column":136,"offset":681},"end":{"line":27,"column":150,"offset":695},"indent":[]}},{"type":"text","value":" ,","position":{"start":{"line":27,"column":150,"offset":695},"end":{"line":27,"column":152,"offset":697},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'easePolyOut'</code>","position":{"start":{"line":27,"column":152,"offset":697},"end":{"line":27,"column":167,"offset":712},"indent":[]}},{"type":"text","value":" , ","position":{"start":{"line":27,"column":167,"offset":712},"end":{"line":27,"column":170,"offset":715},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'easePolyInOut'</code>","position":{"start":{"line":27,"column":170,"offset":715},"end":{"line":27,"column":187,"offset":732},"indent":[]}},{"type":"text","value":" ,","position":{"start":{"line":27,"column":187,"offset":732},"end":{"line":27,"column":190,"offset":735},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":27,"column":190,"offset":735},"end":{"line":27,"column":196,"offset":741},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'``easeQuad``'</code>","position":{"start":{"line":27,"column":196,"offset":741},"end":{"line":27,"column":212,"offset":757},"indent":[]}},{"type":"text","value":" ,","position":{"start":{"line":27,"column":212,"offset":757},"end":{"line":27,"column":214,"offset":759},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'easeQuadIn'</code>","position":{"start":{"line":27,"column":214,"offset":759},"end":{"line":27,"column":228,"offset":773},"indent":[]}},{"type":"text","value":" ,","position":{"start":{"line":27,"column":228,"offset":773},"end":{"line":27,"column":230,"offset":775},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'easeQuadOut'</code>","position":{"start":{"line":27,"column":230,"offset":775},"end":{"line":27,"column":245,"offset":790},"indent":[]}},{"type":"text","value":" , ","position":{"start":{"line":27,"column":245,"offset":790},"end":{"line":27,"column":248,"offset":793},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">'easeQuadInOut'</code>","position":{"start":{"line":27,"column":248,"offset":793},"end":{"line":27,"column":265,"offset":810},"indent":[]}},{"type":"text","value":" ,","position":{"start":{"line":27,"column":265,"offset":810},"end":{"line":27,"column":267,"offset":812},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":27,"column":267,"offset":812},"end":{"line":27,"column":273,"offset":818},"indent":[]}},{"type":"text","value":"...... ","position":{"start":{"line":27,"column":273,"offset":818},"end":{"line":27,"column":280,"offset":825},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":27,"column":280,"offset":825},"end":{"line":27,"column":286,"offset":831},"indent":[]}},{"type":"text","value":"更多取值及所有取值含义参见:","position":{"start":{"line":27,"column":286,"offset":831},"end":{"line":27,"column":300,"offset":845},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/d3/d3/blob/master/API.md#easings-d3-ease","children":[{"type":"text","value":"d3 Easings","position":{"start":{"line":27,"column":301,"offset":846},"end":{"line":27,"column":311,"offset":856},"indent":[]}}],"position":{"start":{"line":27,"column":300,"offset":845},"end":{"line":27,"column":373,"offset":918},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":"。","position":{"start":{"line":27,"column":373,"offset":918},"end":{"line":27,"column":374,"offset":919},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":546},"end":{"line":27,"column":374,"offset":919},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"link","url":"#元素动画","title":null,"children":[],"data":{"hProperties":{"aria-label":"元素动画 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"元素动画","position":{"start":{"line":30,"column":4,"offset":925},"end":{"line":30,"column":8,"offset":929},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":922},"end":{"line":30,"column":8,"offset":929},"indent":[]},"data":{"id":"元素动画","htmlAttributes":{"id":"元素动画"},"hProperties":{"id":"元素动画"}}},{"type":"paragraph","children":[{"type":"text","value":"由于 G6 的内置节点和边是没有动画的,需要实现节点和边上的动画需要通过","position":{"start":{"line":31,"column":1,"offset":930},"end":{"line":31,"column":37,"offset":966},"indent":[]}},{"type":"link","title":null,"url":"https://www.yuque.com/antv/g6/self-node","children":[{"type":"text","value":"自定义节点","position":{"start":{"line":31,"column":38,"offset":967},"end":{"line":31,"column":43,"offset":972},"indent":[]}}],"position":{"start":{"line":31,"column":37,"offset":966},"end":{"line":31,"column":85,"offset":1014},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":"、","position":{"start":{"line":31,"column":85,"offset":1014},"end":{"line":31,"column":86,"offset":1015},"indent":[]}},{"type":"link","title":null,"url":"https://www.yuque.com/antv/g6/self-edge","children":[{"type":"text","value":"自定义边","position":{"start":{"line":31,"column":87,"offset":1016},"end":{"line":31,"column":91,"offset":1020},"indent":[]}}],"position":{"start":{"line":31,"column":86,"offset":1015},"end":{"line":31,"column":133,"offset":1062},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":"时复写 ","position":{"start":{"line":31,"column":133,"offset":1062},"end":{"line":31,"column":137,"offset":1066},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">afterDraw</code>","position":{"start":{"line":31,"column":137,"offset":1066},"end":{"line":31,"column":148,"offset":1077},"indent":[]}},{"type":"text","value":" 实现。","position":{"start":{"line":31,"column":148,"offset":1077},"end":{"line":31,"column":152,"offset":1081},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":930},"end":{"line":31,"column":152,"offset":1081},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"link","url":"#节点动画","title":null,"children":[],"data":{"hProperties":{"aria-label":"节点动画 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"节点动画","position":{"start":{"line":33,"column":5,"offset":1087},"end":{"line":33,"column":9,"offset":1091},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":1083},"end":{"line":33,"column":9,"offset":1091},"indent":[]},"data":{"id":"节点动画","htmlAttributes":{"id":"节点动画"},"hProperties":{"id":"节点动画"}}},{"type":"paragraph","children":[{"type":"text","value":"关于节点动画,以下面三个动画示例进行讲解:","position":{"start":{"line":34,"column":1,"offset":1092},"end":{"line":34,"column":22,"offset":1113},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":1092},"end":{"line":34,"column":22,"offset":1113},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"节点上图形的动画(如下图左);","position":{"start":{"line":36,"column":3,"offset":1117},"end":{"line":36,"column":18,"offset":1132},"indent":[]}}],"position":{"start":{"line":36,"column":3,"offset":1117},"end":{"line":36,"column":18,"offset":1132},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":1115},"end":{"line":36,"column":18,"offset":1132},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"增加带有动画的背景图形(如下图中);","position":{"start":{"line":37,"column":3,"offset":1135},"end":{"line":37,"column":21,"offset":1153},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":1135},"end":{"line":37,"column":21,"offset":1153},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":1133},"end":{"line":37,"column":21,"offset":1153},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"节点上部分图形的旋转动画(如下图右)。","position":{"start":{"line":38,"column":3,"offset":1156},"end":{"line":38,"column":22,"offset":1175},"indent":[]}}],"position":{"start":{"line":38,"column":3,"offset":1156},"end":{"line":38,"column":22,"offset":1175},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":1154},"end":{"line":38,"column":22,"offset":1175},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":1115},"end":{"line":38,"column":22,"offset":1175},"indent":[1,1]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571195005968-ecf8690b-707a-4acd-bcda-e9b49e74742f.gif#align=left&display=inline&height=61&name=node-animate-shape.gif&originHeight=61&originWidth=145&search=&size=22895&status=done&width=145' alt='download' width='150'/>\n<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571195552693-6faff5bc-8d9a-4e4e-99fd-7bd7fa9c428d.gif#align=left&display=inline&height=61&name=node-animate-background.gif&originHeight=61&originWidth=145&search=&size=35273&status=done&width=145' alt='download' width='150'/>\n<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571196247789-91a9d9a3-754d-481f-9f63-901b0e16f83c.gif#align=left&display=inline&height=61&name=node-animate-innerimage.gif&originHeight=61&originWidth=145&search=&size=29110&status=done&width=145' alt='download' width='150'/>\n<br />","position":{"start":{"line":41,"column":1,"offset":1178},"end":{"line":44,"column":7,"offset":2028},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"以上三个动画节点的 demo 代码见:\n","position":{"start":{"line":46,"column":1,"offset":2030},"end":{"line":47,"column":1,"offset":2050},"indent":[1]}},{"type":"link","title":null,"url":"https://codepen.io/Yanyan-Wang/pen/QWWEEWe","children":[{"type":"text","value":"节点动画","position":{"start":{"line":47,"column":2,"offset":2051},"end":{"line":47,"column":6,"offset":2055},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":2050},"end":{"line":47,"column":51,"offset":2100},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":"。","position":{"start":{"line":47,"column":51,"offset":2100},"end":{"line":47,"column":52,"offset":2101},"indent":[]}}],"position":{"start":{"line":46,"column":1,"offset":2030},"end":{"line":47,"column":52,"offset":2101},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"link","url":"#节点上图形的动画","title":null,"children":[],"data":{"hProperties":{"aria-label":"节点上图形的动画 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"节点上图形的动画","position":{"start":{"line":49,"column":6,"offset":2108},"end":{"line":49,"column":14,"offset":2116},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":2103},"end":{"line":49,"column":14,"offset":2116},"indent":[]},"data":{"id":"节点上图形的动画","htmlAttributes":{"id":"节点上图形的动画"},"hProperties":{"id":"节点上图形的动画"}}},{"type":"paragraph","children":[{"type":"text","value":"节点上的动画,即每一帧发生变化的是节点上的某一个图形。","position":{"start":{"line":50,"column":1,"offset":2117},"end":{"line":50,"column":28,"offset":2144},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":50,"column":28,"offset":2144},"end":{"line":50,"column":34,"offset":2150},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2117},"end":{"line":50,"column":34,"offset":2150},"indent":[]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571195005968-ecf8690b-707a-4acd-bcda-e9b49e74742f.gif#align=left&display=inline&height=61&name=node-animate-shape.gif&originHeight=61&originWidth=145&search=&size=22895&status=done&width=145' alt='download' width='150'/>","position":{"start":{"line":52,"column":1,"offset":2152},"end":{"line":52,"column":278,"offset":2429},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"本例实现节点放大缩小,通过 ","position":{"start":{"line":54,"column":1,"offset":2431},"end":{"line":54,"column":15,"offset":2445},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">group.get('children')[0]</code>","position":{"start":{"line":54,"column":15,"offset":2445},"end":{"line":54,"column":41,"offset":2471},"indent":[]}},{"type":"text","value":" 找到需要更新的图形(这里找到该节点上第 0 个图形),然后调用该图形的 ","position":{"start":{"line":54,"column":41,"offset":2471},"end":{"line":54,"column":78,"offset":2508},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">animate</code>","position":{"start":{"line":54,"column":78,"offset":2508},"end":{"line":54,"column":87,"offset":2517},"indent":[]}},{"type":"text","value":" 方法指定动画的参数及每一帧的变化( ","position":{"start":{"line":54,"column":87,"offset":2517},"end":{"line":54,"column":106,"offset":2536},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">onFrame</code>","position":{"start":{"line":54,"column":106,"offset":2536},"end":{"line":54,"column":115,"offset":2545},"indent":[]}},{"type":"text","value":" 方法返回每一帧需要变化的参数集)。","position":{"start":{"line":54,"column":115,"offset":2545},"end":{"line":54,"column":133,"offset":2563},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":2431},"end":{"line":54,"column":133,"offset":2563},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 放大、变小动画</span>\n<span class=\"token constant\">G6</span><span class=\"token punctuation\">.</span><span class=\"token function\">registerNode</span><span class=\"token punctuation\">(</span>\n <span class=\"token string\">'circle-animate'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token function\">afterDraw</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cfg<span class=\"token punctuation\">,</span> group</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 获取该节点上的第一个图形</span>\n <span class=\"token keyword\">const</span> shape <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'children'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 该图形的动画</span>\n shape<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 动画重复</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n <span class=\"token comment\">// 每一帧的操作,入参 ratio:这一帧的比例值(Number)。返回值:这一帧需要变化的参数集(Object)。</span>\n <span class=\"token function\">onFrame</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ratio</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 先变大、再变小</span>\n <span class=\"token keyword\">const</span> diff <span class=\"token operator\">=</span> ratio <span class=\"token operator\"><=</span> <span class=\"token number\">0.5</span> <span class=\"token operator\">?</span> ratio <span class=\"token operator\">*</span> <span class=\"token number\">10</span> <span class=\"token punctuation\">:</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">-</span> ratio<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">let</span> radius <span class=\"token operator\">=</span> cfg<span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNaN</span><span class=\"token punctuation\">(</span>radius<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> radius <span class=\"token operator\">=</span> radius<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 返回这一帧需要变化的参数集,这里只包含了半径</span>\n <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n r<span class=\"token punctuation\">:</span> radius <span class=\"token operator\">/</span> <span class=\"token number\">2</span> <span class=\"token operator\">+</span> diff<span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'easeCubic'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 一次动画持续的时长为 3000,动画效果为 'easeCubic'</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'circle'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 该自定义节点继承了内置节点 'circle',除了被复写的 afterDraw 方法外,其他按照 'circle' 里的函数执行。</span>\n</code></pre></div>","position":{"start":{"line":55,"column":1,"offset":2564},"end":{"line":79,"column":4,"offset":3289},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"link","url":"#增加带有动画的背景图形","title":null,"children":[],"data":{"hProperties":{"aria-label":"增加带有动画的背景图形 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"增加带有动画的背景图形","position":{"start":{"line":81,"column":6,"offset":3296},"end":{"line":81,"column":17,"offset":3307},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":3291},"end":{"line":81,"column":17,"offset":3307},"indent":[]},"data":{"id":"增加带有动画的背景图形","htmlAttributes":{"id":"增加带有动画的背景图形"},"hProperties":{"id":"增加带有动画的背景图形"}}},{"type":"paragraph","children":[{"type":"text","value":"在 ","position":{"start":{"line":82,"column":1,"offset":3308},"end":{"line":82,"column":3,"offset":3310},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">afterDraw</code>","position":{"start":{"line":82,"column":3,"offset":3310},"end":{"line":82,"column":14,"offset":3321},"indent":[]}},{"type":"text","value":" 方法中为已有节点添加额外的 shape ,并为这些新增的图形设置动画。","position":{"start":{"line":82,"column":14,"offset":3321},"end":{"line":82,"column":50,"offset":3357},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":82,"column":50,"offset":3357},"end":{"line":82,"column":56,"offset":3363},"indent":[]}}],"position":{"start":{"line":82,"column":1,"offset":3308},"end":{"line":82,"column":56,"offset":3363},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"本例在 ","position":{"start":{"line":84,"column":1,"offset":3365},"end":{"line":84,"column":5,"offset":3369},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">afterDraw</code>","position":{"start":{"line":84,"column":5,"offset":3369},"end":{"line":84,"column":16,"offset":3380},"indent":[]}},{"type":"text","value":" 方法中,绘制了三个背景 circle ,分别使用不同的颜色填充,再调用 ","position":{"start":{"line":84,"column":16,"offset":3380},"end":{"line":84,"column":53,"offset":3417},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">animate</code>","position":{"start":{"line":84,"column":53,"offset":3417},"end":{"line":84,"column":62,"offset":3426},"indent":[]}},{"type":"text","value":" 方法实现这三个 circle 逐渐变大、变淡的动画。本例中没有使用 ","position":{"start":{"line":84,"column":62,"offset":3426},"end":{"line":84,"column":97,"offset":3461},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">onFrame</code>","position":{"start":{"line":84,"column":97,"offset":3461},"end":{"line":84,"column":106,"offset":3470},"indent":[]}},{"type":"text","value":" 函数,直接在 ","position":{"start":{"line":84,"column":106,"offset":3470},"end":{"line":84,"column":114,"offset":3478},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">animate</code>","position":{"start":{"line":84,"column":114,"offset":3478},"end":{"line":84,"column":123,"offset":3487},"indent":[]}},{"type":"text","value":" 函数的入参中设置每次动画结束时的最终目标样式,即半径增大 10,透明度降为 0.1。","position":{"start":{"line":84,"column":123,"offset":3487},"end":{"line":84,"column":166,"offset":3530},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":84,"column":166,"offset":3530},"end":{"line":84,"column":172,"offset":3536},"indent":[]}}],"position":{"start":{"line":84,"column":1,"offset":3365},"end":{"line":84,"column":172,"offset":3536},"indent":[]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571195577156-137b37fe-bff5-470b-bbd2-2a7b253a6d8e.gif#align=left&display=inline&height=61&name=node-animate-background.gif&originHeight=61&originWidth=145&search=&size=35273&status=done&width=145' alt='download' width='150'/>","position":{"start":{"line":86,"column":1,"offset":3538},"end":{"line":86,"column":283,"offset":3820},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">G6</span><span class=\"token punctuation\">.</span><span class=\"token function\">registerNode</span><span class=\"token punctuation\">(</span>\n <span class=\"token string\">'background-animate'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token function\">afterDraw</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cfg<span class=\"token punctuation\">,</span> group</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">let</span> r <span class=\"token operator\">=</span> cfg<span class=\"token punctuation\">.</span>size <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNaN</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n r <span class=\"token operator\">=</span> cfg<span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n <span class=\"token comment\">// 第一个背景圆</span>\n <span class=\"token keyword\">const</span> back1 <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">addShape</span><span class=\"token punctuation\">(</span><span class=\"token string\">'circle'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n zIndex<span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span>\n attrs<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n x<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n y<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n r<span class=\"token punctuation\">,</span>\n fill<span class=\"token punctuation\">:</span> cfg<span class=\"token punctuation\">.</span>color<span class=\"token punctuation\">,</span>\n opacity<span class=\"token punctuation\">:</span> <span class=\"token number\">0.6</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 第二个背景圆</span>\n <span class=\"token keyword\">const</span> back2 <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">addShape</span><span class=\"token punctuation\">(</span><span class=\"token string\">'circle'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n zIndex<span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n attrs<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n x<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n y<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n r<span class=\"token punctuation\">,</span>\n fill<span class=\"token punctuation\">:</span> <span class=\"token string\">'blue'</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 为了显示清晰,随意设置了颜色</span>\n opacity<span class=\"token punctuation\">:</span> <span class=\"token number\">0.6</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 第三个背景圆</span>\n <span class=\"token keyword\">const</span> back3 <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">addShape</span><span class=\"token punctuation\">(</span><span class=\"token string\">'circle'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n zIndex<span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n attrs<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n x<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n y<span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n r<span class=\"token punctuation\">,</span>\n fill<span class=\"token punctuation\">:</span> <span class=\"token string\">'green'</span><span class=\"token punctuation\">,</span>\n opacity<span class=\"token punctuation\">:</span> <span class=\"token number\">0.6</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n group<span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 排序,根据 zIndex 排序</span>\n\n <span class=\"token comment\">// 第一个背景圆逐渐放大,并消失</span>\n back1<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n r<span class=\"token punctuation\">:</span> r <span class=\"token operator\">+</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n opacity<span class=\"token punctuation\">:</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">,</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 循环</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'easeCubic'</span><span class=\"token punctuation\">,</span>\n <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 无延迟</span>\n\n <span class=\"token comment\">// 第二个背景圆逐渐放大,并消失</span>\n back2<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n r<span class=\"token punctuation\">:</span> r <span class=\"token operator\">+</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n opacity<span class=\"token punctuation\">:</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">,</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 循环</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'easeCubic'</span><span class=\"token punctuation\">,</span>\n <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">1000</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1 秒延迟</span>\n\n <span class=\"token comment\">// 第三个背景圆逐渐放大,并消失</span>\n back3<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n r<span class=\"token punctuation\">:</span> r <span class=\"token operator\">+</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n opacity<span class=\"token punctuation\">:</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">,</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 循环</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'easeCubic'</span><span class=\"token punctuation\">,</span>\n <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">2000</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 2 秒延迟</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'circle'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre></div>","position":{"start":{"line":88,"column":1,"offset":3822},"end":{"line":152,"column":4,"offset":5090},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"link","url":"#部分图形旋转动画","title":null,"children":[],"data":{"hProperties":{"aria-label":"部分图形旋转动画 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"部分图形旋转动画","position":{"start":{"line":154,"column":6,"offset":5097},"end":{"line":154,"column":14,"offset":5105},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":5092},"end":{"line":154,"column":14,"offset":5105},"indent":[]},"data":{"id":"部分图形旋转动画","htmlAttributes":{"id":"部分图形旋转动画"},"hProperties":{"id":"部分图形旋转动画"}}},{"type":"paragraph","children":[{"type":"text","value":"这一例也是在 ","position":{"start":{"line":155,"column":1,"offset":5106},"end":{"line":155,"column":8,"offset":5113},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">afterDraw</code>","position":{"start":{"line":155,"column":8,"offset":5113},"end":{"line":155,"column":19,"offset":5124},"indent":[]}},{"type":"text","value":" 方法中为已有节点添加额外的 shape (本例中为 image),并为这些新增的图形设置旋转动画。旋转动画较为复杂,需要通过矩阵的操作实现。","position":{"start":{"line":155,"column":19,"offset":5124},"end":{"line":155,"column":90,"offset":5195},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":155,"column":90,"offset":5195},"end":{"line":155,"column":96,"offset":5201},"indent":[]}}],"position":{"start":{"line":155,"column":1,"offset":5106},"end":{"line":155,"column":96,"offset":5201},"indent":[]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571196247789-91a9d9a3-754d-481f-9f63-901b0e16f83c.gif#align=left&display=inline&height=61&name=node-animate-innerimage.gif&originHeight=61&originWidth=145&search=&size=29110&status=done&width=145' alt='download' width='150'/>","position":{"start":{"line":157,"column":1,"offset":5203},"end":{"line":157,"column":283,"offset":5485},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">G6</span><span class=\"token punctuation\">.</span><span class=\"token function\">registerNode</span><span class=\"token punctuation\">(</span>\n <span class=\"token string\">'inner-animate'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token function\">afterDraw</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cfg<span class=\"token punctuation\">,</span> group</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">const</span> size <span class=\"token operator\">=</span> cfg<span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">const</span> width <span class=\"token operator\">=</span> size<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> <span class=\"token number\">12</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">const</span> height <span class=\"token operator\">=</span> size<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> <span class=\"token number\">12</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 添加图片 shape</span>\n <span class=\"token keyword\">const</span> image <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">addShape</span><span class=\"token punctuation\">(</span><span class=\"token string\">'image'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n attrs<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n x<span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span>width <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n y<span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span>height <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n width<span class=\"token punctuation\">:</span> width<span class=\"token punctuation\">,</span>\n height<span class=\"token punctuation\">:</span> height<span class=\"token punctuation\">,</span>\n img<span class=\"token punctuation\">:</span> cfg<span class=\"token punctuation\">.</span>img<span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 该图片 shape 的动画</span>\n image<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 动画重复</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n <span class=\"token comment\">// 每一帧的操作,入参 ratio:这一帧的比例值(Number)。返回值:这一帧需要变化的参数集(Object)。</span>\n <span class=\"token function\">onFrame</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ratio</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 旋转通过矩阵来实现</span>\n <span class=\"token comment\">// 当前矩阵</span>\n <span class=\"token keyword\">const</span> matrix <span class=\"token operator\">=</span> Util<span class=\"token punctuation\">.</span>mat3<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 目标矩阵</span>\n <span class=\"token keyword\">const</span> toMatrix <span class=\"token operator\">=</span> Util<span class=\"token punctuation\">.</span><span class=\"token function\">transform</span><span class=\"token punctuation\">(</span>matrix<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>\n <span class=\"token punctuation\">[</span><span class=\"token string\">'r'</span><span class=\"token punctuation\">,</span> ratio <span class=\"token operator\">*</span> Math<span class=\"token punctuation\">.</span><span class=\"token constant\">PI</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 返回这一帧需要的参数集,本例中只有目标矩阵</span>\n <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n matrix<span class=\"token punctuation\">:</span> toMatrix<span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'easeCubic'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'rect'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre></div>","position":{"start":{"line":159,"column":1,"offset":5487},"end":{"line":196,"column":4,"offset":6365},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"link","url":"#边动画","title":null,"children":[],"data":{"hProperties":{"aria-label":"边动画 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"边动画","position":{"start":{"line":198,"column":5,"offset":6371},"end":{"line":198,"column":8,"offset":6374},"indent":[]}}],"position":{"start":{"line":198,"column":1,"offset":6367},"end":{"line":198,"column":8,"offset":6374},"indent":[]},"data":{"id":"边动画","htmlAttributes":{"id":"边动画"},"hProperties":{"id":"边动画"}}},{"type":"paragraph","children":[{"type":"text","value":"关于边动画,以下面三个动画示例进行讲解:","position":{"start":{"line":199,"column":1,"offset":6375},"end":{"line":199,"column":21,"offset":6395},"indent":[]}}],"position":{"start":{"line":199,"column":1,"offset":6375},"end":{"line":199,"column":21,"offset":6395},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"圆点在沿着线运动(下图左);","position":{"start":{"line":201,"column":3,"offset":6399},"end":{"line":201,"column":17,"offset":6413},"indent":[]}}],"position":{"start":{"line":201,"column":3,"offset":6399},"end":{"line":201,"column":17,"offset":6413},"indent":[]}}],"position":{"start":{"line":201,"column":1,"offset":6397},"end":{"line":201,"column":17,"offset":6413},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"虚线运动的效果(下图中,gif 图片的帧率问题导致看起来是静态的,可以访问下面的 demo 链接查看);","position":{"start":{"line":202,"column":3,"offset":6416},"end":{"line":202,"column":55,"offset":6468},"indent":[]}}],"position":{"start":{"line":202,"column":3,"offset":6416},"end":{"line":202,"column":55,"offset":6468},"indent":[]}}],"position":{"start":{"line":202,"column":1,"offset":6414},"end":{"line":202,"column":55,"offset":6468},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"线从无到有的效果(下图右)。","position":{"start":{"line":203,"column":3,"offset":6471},"end":{"line":203,"column":17,"offset":6485},"indent":[]}}],"position":{"start":{"line":203,"column":3,"offset":6471},"end":{"line":203,"column":17,"offset":6485},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6469},"end":{"line":203,"column":17,"offset":6485},"indent":[]}}],"position":{"start":{"line":201,"column":1,"offset":6397},"end":{"line":203,"column":17,"offset":6485},"indent":[1,1]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571198610044-dcb4664b-1676-4ade-8f72-db5ae3c0820f.gif#align=left&display=inline&height=120&name=edge-animate-running.gif&originHeight=120&originWidth=145&search=&size=6246&status=done&width=145' alt='download' width='150'/>\n<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571200417875-e388a583-5ec7-4a5d-94e8-61ac30608dcc.gif#align=left&display=inline&height=112&name=edge-animate-lineDash.gif&originHeight=310&originWidth=317&search=&size=2892&status=done&width=115' alt='download' width='110'/>\n<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571199744260-b3d325f7-d6aa-407a-a1c7-7152c7d30cdb.gif#align=left&display=inline&height=120&name=edge-animate-grow.gif&originHeight=120&originWidth=145&search=&size=7012&status=done&width=145' alt='download' width='150'/>","position":{"start":{"line":206,"column":1,"offset":6488},"end":{"line":208,"column":278,"offset":7328},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"以上三个边动画的 demo 代码见:","position":{"start":{"line":210,"column":1,"offset":7330},"end":{"line":210,"column":19,"offset":7348},"indent":[]}},{"type":"link","title":null,"url":"https://codepen.io/Yanyan-Wang/pen/yLLJJoJ","children":[{"type":"text","value":"边动画","position":{"start":{"line":210,"column":20,"offset":7349},"end":{"line":210,"column":23,"offset":7352},"indent":[]}}],"position":{"start":{"line":210,"column":19,"offset":7348},"end":{"line":210,"column":68,"offset":7397},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":"。","position":{"start":{"line":210,"column":68,"offset":7397},"end":{"line":210,"column":69,"offset":7398},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":7330},"end":{"line":210,"column":69,"offset":7398},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"link","url":"#圆点运动","title":null,"children":[],"data":{"hProperties":{"aria-label":"圆点运动 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"圆点运动","position":{"start":{"line":212,"column":6,"offset":7405},"end":{"line":212,"column":10,"offset":7409},"indent":[]}}],"position":{"start":{"line":212,"column":1,"offset":7400},"end":{"line":212,"column":10,"offset":7409},"indent":[]},"data":{"id":"圆点运动","htmlAttributes":{"id":"圆点运动"},"hProperties":{"id":"圆点运动"}}},{"type":"paragraph","children":[{"type":"text","value":"本例通过在 afterDraw 方法中为边增加了一个 circle 图形,该图形沿着线运动。沿着线运动的原理:设定每一帧中,该 circle 在线上的相对位置。","position":{"start":{"line":213,"column":1,"offset":7410},"end":{"line":213,"column":81,"offset":7490},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":213,"column":81,"offset":7490},"end":{"line":213,"column":87,"offset":7496},"indent":[]}}],"position":{"start":{"line":213,"column":1,"offset":7410},"end":{"line":213,"column":87,"offset":7496},"indent":[]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571198610044-dcb4664b-1676-4ade-8f72-db5ae3c0820f.gif#align=left&display=inline&height=120&name=edge-animate-running.gif&originHeight=120&originWidth=145&search=&size=6246&status=done&width=145' alt='download' width='150'/>","position":{"start":{"line":215,"column":1,"offset":7498},"end":{"line":215,"column":281,"offset":7778},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">G6</span><span class=\"token punctuation\">.</span><span class=\"token function\">registerEdge</span><span class=\"token punctuation\">(</span>\n <span class=\"token string\">'circle-running'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token function\">afterDraw</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cfg<span class=\"token punctuation\">,</span> group</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 获得当前边的第一个图形,这里是边本身的 path</span>\n <span class=\"token keyword\">const</span> shape <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'children'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 边 path 的起点位置</span>\n <span class=\"token keyword\">const</span> startPoint <span class=\"token operator\">=</span> shape<span class=\"token punctuation\">.</span><span class=\"token function\">getPoint</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n <span class=\"token comment\">// 添加红色 circle 图形</span>\n <span class=\"token keyword\">const</span> circle <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">addShape</span><span class=\"token punctuation\">(</span><span class=\"token string\">'circle'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n attrs<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n x<span class=\"token punctuation\">:</span> startPoint<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span>\n y<span class=\"token punctuation\">:</span> startPoint<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">,</span>\n fill<span class=\"token punctuation\">:</span> <span class=\"token string\">'red'</span><span class=\"token punctuation\">,</span>\n r<span class=\"token punctuation\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n <span class=\"token comment\">// 对红色圆点添加动画</span>\n circle<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 动画重复</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n <span class=\"token comment\">// 每一帧的操作,入参 ratio:这一帧的比例值(Number)。返回值:这一帧需要变化的参数集(Object)。</span>\n <span class=\"token function\">onFrame</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ratio</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 根据比例值,获得在边 path 上对应比例的位置。</span>\n <span class=\"token keyword\">const</span> tmpPoint <span class=\"token operator\">=</span> shape<span class=\"token punctuation\">.</span><span class=\"token function\">getPoint</span><span class=\"token punctuation\">(</span>ratio<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 返回需要变化的参数集,这里返回了位置 x 和 y</span>\n <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n x<span class=\"token punctuation\">:</span> tmpPoint<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span>\n y<span class=\"token punctuation\">:</span> tmpPoint<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 一次动画的时间长度</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'cubic'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 该自定义边继承内置三阶贝塞尔曲线 cubic</span>\n</code></pre></div>","position":{"start":{"line":217,"column":1,"offset":7780},"end":{"line":252,"column":4,"offset":8628},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"link","url":"#虚线运动的效果","title":null,"children":[],"data":{"hProperties":{"aria-label":"虚线运动的效果 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"虚线运动的效果","position":{"start":{"line":254,"column":6,"offset":8635},"end":{"line":254,"column":13,"offset":8642},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":8630},"end":{"line":254,"column":13,"offset":8642},"indent":[]},"data":{"id":"虚线运动的效果","htmlAttributes":{"id":"虚线运动的效果"},"hProperties":{"id":"虚线运动的效果"}}},{"type":"paragraph","children":[{"type":"text","value":"虚线运动的效果是通过计算线的 ","position":{"start":{"line":255,"column":1,"offset":8643},"end":{"line":255,"column":16,"offset":8658},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">lineDash</code>","position":{"start":{"line":255,"column":16,"offset":8658},"end":{"line":255,"column":26,"offset":8668},"indent":[]}},{"type":"text","value":" ,并在每一帧中不断修改实现。","position":{"start":{"line":255,"column":26,"offset":8668},"end":{"line":255,"column":41,"offset":8683},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":255,"column":41,"offset":8683},"end":{"line":255,"column":47,"offset":8689},"indent":[]}}],"position":{"start":{"line":255,"column":1,"offset":8643},"end":{"line":255,"column":47,"offset":8689},"indent":[]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571200417875-e388a583-5ec7-4a5d-94e8-61ac30608dcc.gif#align=left&display=inline&height=112&name=edge-animate-lineDash.gif&originHeight=310&originWidth=317&search=&size=2892&status=done&width=115' alt='download' width='150'/>","position":{"start":{"line":258,"column":1,"offset":8692},"end":{"line":258,"column":282,"offset":8973},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// lineDash 的差值,可以在后面提供 util 方法自动计算</span>\n<span class=\"token keyword\">const</span> dashArray <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> lineDash <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> interval <span class=\"token operator\">=</span> <span class=\"token number\">9</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// lineDash 的和</span>\n<span class=\"token constant\">G6</span><span class=\"token punctuation\">.</span><span class=\"token function\">registerEdge</span><span class=\"token punctuation\">(</span>\n <span class=\"token string\">'line-dash'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token function\">afterDraw</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cfg<span class=\"token punctuation\">,</span> group</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 获得该边的第一个图形,这里是边的 path</span>\n <span class=\"token keyword\">const</span> shape <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'children'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 获得边的 path 的总长度</span>\n <span class=\"token keyword\">const</span> length <span class=\"token operator\">=</span> shape<span class=\"token punctuation\">.</span><span class=\"token function\">getTotalLength</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">let</span> totalArray <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 计算出整条线的 lineDash</span>\n <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\"><</span> length<span class=\"token punctuation\">;</span> i <span class=\"token operator\">+=</span> interval<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n totalArray <span class=\"token operator\">=</span> totalArray<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>lineDash<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n\n <span class=\"token keyword\">let</span> index <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 边 path 图形的动画</span>\n shape<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 动画重复</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n <span class=\"token comment\">// 每一帧的操作,入参 ratio:这一帧的比例值(Number)。返回值:这一帧需要变化的参数集(Object)。</span>\n <span class=\"token function\">onFrame</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ratio</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">const</span> cfg <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n lineDash<span class=\"token punctuation\">:</span> dashArray<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>totalArray<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 每次移动 1</span>\n index <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> interval<span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 返回需要修改的参数集,这里只修改了 lineDash</span>\n <span class=\"token keyword\">return</span> cfg<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 一次动画的时长为 3000</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'cubic'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 该自定义边继承了内置三阶贝塞尔曲线边 cubic</span>\n</code></pre></div>","position":{"start":{"line":260,"column":1,"offset":8975},"end":{"line":306,"column":4,"offset":10048},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"link","url":"#线从无到有","title":null,"children":[],"data":{"hProperties":{"aria-label":"线从无到有 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"线从无到有","position":{"start":{"line":308,"column":6,"offset":10055},"end":{"line":308,"column":11,"offset":10060},"indent":[]}}],"position":{"start":{"line":308,"column":1,"offset":10050},"end":{"line":308,"column":11,"offset":10060},"indent":[]},"data":{"id":"线从无到有","htmlAttributes":{"id":"线从无到有"},"hProperties":{"id":"线从无到有"}}},{"type":"paragraph","children":[{"type":"text","value":"线从无到有的动画效果,同样可以通过计算 ","position":{"start":{"line":309,"column":1,"offset":10061},"end":{"line":309,"column":21,"offset":10081},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">lineDash</code>","position":{"start":{"line":309,"column":21,"offset":10081},"end":{"line":309,"column":31,"offset":10091},"indent":[]}},{"type":"text","value":" 来实现。","position":{"start":{"line":309,"column":31,"offset":10091},"end":{"line":309,"column":36,"offset":10096},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":309,"column":36,"offset":10096},"end":{"line":309,"column":42,"offset":10102},"indent":[]}}],"position":{"start":{"line":309,"column":1,"offset":10061},"end":{"line":309,"column":42,"offset":10102},"indent":[]}},{"type":"html","value":"<img src='https://cdn.nlark.com/yuque/0/2019/gif/156681/1571199744260-b3d325f7-d6aa-407a-a1c7-7152c7d30cdb.gif#align=left&display=inline&height=120&name=edge-animate-grow.gif&originHeight=120&originWidth=145&search=&size=7012&status=done&width=145' alt='download' width='150'/>","position":{"start":{"line":311,"column":1,"offset":10104},"end":{"line":311,"column":278,"offset":10381},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">G6</span><span class=\"token punctuation\">.</span><span class=\"token function\">registerEdge</span><span class=\"token punctuation\">(</span>\n <span class=\"token string\">'line-growth'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token function\">afterDraw</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cfg<span class=\"token punctuation\">,</span> group</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">const</span> shape <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'children'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">const</span> length <span class=\"token operator\">=</span> group<span class=\"token punctuation\">.</span><span class=\"token function\">getTotalLength</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n shape<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 动画重复</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n <span class=\"token comment\">// 每一帧的操作,入参 ratio:这一帧的比例值(Number)。返回值:这一帧需要变化的参数集(Object)。</span>\n <span class=\"token function\">onFrame</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ratio</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">const</span> startLen <span class=\"token operator\">=</span> ratio <span class=\"token operator\">*</span> length<span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 计算线的lineDash</span>\n <span class=\"token keyword\">const</span> cfg <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n lineDash<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>startLen<span class=\"token punctuation\">,</span> length <span class=\"token operator\">-</span> startLen<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">return</span> cfg<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">2000</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 一次动画的时长为 2000</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'cubic'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 该自定义边继承了内置三阶贝塞尔曲线边 cubic</span>\n</code></pre></div>","position":{"start":{"line":313,"column":1,"offset":10383},"end":{"line":333,"column":4,"offset":10944},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"link","url":"#交互动画","title":null,"children":[],"data":{"hProperties":{"aria-label":"交互动画 permalink","class":"anchor"},"hChildren":[{"type":"raw","value":"<svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg>"}]}},{"type":"text","value":"交互动画","position":{"start":{"line":335,"column":5,"offset":10950},"end":{"line":335,"column":9,"offset":10954},"indent":[]}}],"position":{"start":{"line":335,"column":1,"offset":10946},"end":{"line":335,"column":9,"offset":10954},"indent":[]},"data":{"id":"交互动画","htmlAttributes":{"id":"交互动画"},"hProperties":{"id":"交互动画"}}},{"type":"paragraph","children":[{"type":"text","value":"在交互的过程中也可以添加动画。如下图所示,当鼠标移到节点上时,所有与该节点相关联的边都展示虚线运动的动画。","position":{"start":{"line":336,"column":1,"offset":10955},"end":{"line":336,"column":54,"offset":11008},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":336,"column":54,"offset":11008},"end":{"line":336,"column":60,"offset":11014},"indent":[]}},{"type":"image","title":null,"url":"https://cdn.nlark.com/yuque/0/2019/gif/244306/1561463491982-54ef73c2-fbf7-4886-8d45-f7b8ec8e1976.gif#align=left&display=inline&height=285&name=%E4%BA%A4%E4%BA%92%E5%8A%A8%E7%94%BB.gif&originHeight=586&originWidth=588&search=&size=729910&status=done&width=286","alt":"交互动画.gif","position":{"start":{"line":336,"column":60,"offset":11014},"end":{"line":336,"column":331,"offset":11285},"indent":[]}},{"type":"html","value":"<br />","position":{"start":{"line":336,"column":331,"offset":11285},"end":{"line":336,"column":337,"offset":11291},"indent":[]}},{"type":"text","value":"上图完整 demo 即代码参见:","position":{"start":{"line":336,"column":337,"offset":11291},"end":{"line":336,"column":353,"offset":11307},"indent":[]}},{"type":"link","title":null,"url":"https://antv.alipay.com/zh-cn/g6/3.x/demo/scatter/hover-animate.html","children":[{"type":"text","value":"状态切换动画","position":{"start":{"line":336,"column":354,"offset":11308},"end":{"line":336,"column":360,"offset":11314},"indent":[]}}],"position":{"start":{"line":336,"column":353,"offset":11307},"end":{"line":336,"column":431,"offset":11385},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":"。","position":{"start":{"line":336,"column":431,"offset":11385},"end":{"line":336,"column":432,"offset":11386},"indent":[]}}],"position":{"start":{"line":336,"column":1,"offset":10955},"end":{"line":336,"column":432,"offset":11386},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"这种动画涉及到了边的 ","position":{"start":{"line":338,"column":1,"offset":11388},"end":{"line":338,"column":12,"offset":11399},"indent":[]}},{"type":"link","title":null,"url":"https://www.yuque.com/antv/g6/fqnn9w","children":[{"type":"text","value":"状态","position":{"start":{"line":338,"column":13,"offset":11400},"end":{"line":338,"column":15,"offset":11402},"indent":[]}}],"position":{"start":{"line":338,"column":12,"offset":11399},"end":{"line":338,"column":54,"offset":11441},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":"。在自定义边时复写 ","position":{"start":{"line":338,"column":54,"offset":11441},"end":{"line":338,"column":64,"offset":11451},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">setState</code>","position":{"start":{"line":338,"column":64,"offset":11451},"end":{"line":338,"column":74,"offset":11461},"indent":[]}},{"type":"text","value":" 方法,可对边的各种状态进行监听。鼠标移动到节点上,相关边的某个状态被开启,","position":{"start":{"line":338,"column":74,"offset":11461},"end":{"line":338,"column":112,"offset":11499},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">setState</code>","position":{"start":{"line":338,"column":112,"offset":11499},"end":{"line":338,"column":122,"offset":11509},"indent":[]}},{"type":"text","value":" 方法中监听到后开启动画效果。步骤如下:","position":{"start":{"line":338,"column":122,"offset":11509},"end":{"line":338,"column":142,"offset":11529},"indent":[]}}],"position":{"start":{"line":338,"column":1,"offset":11388},"end":{"line":338,"column":142,"offset":11529},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"自定义边中复写 ","position":{"start":{"line":340,"column":3,"offset":11533},"end":{"line":340,"column":11,"offset":11541},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">setState</code>","position":{"start":{"line":340,"column":11,"offset":11541},"end":{"line":340,"column":21,"offset":11551},"indent":[]}},{"type":"text","value":" 方法监听该边的状态,以及某状态下的动画效果;","position":{"start":{"line":340,"column":21,"offset":11551},"end":{"line":340,"column":44,"offset":11574},"indent":[]}}],"position":{"start":{"line":340,"column":3,"offset":11533},"end":{"line":340,"column":44,"offset":11574},"indent":[]}}],"position":{"start":{"line":340,"column":1,"offset":11531},"end":{"line":340,"column":44,"offset":11574},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"监听中间的节点的 ","position":{"start":{"line":341,"column":3,"offset":11577},"end":{"line":341,"column":12,"offset":11586},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">mouseenter</code>","position":{"start":{"line":341,"column":12,"offset":11586},"end":{"line":341,"column":24,"offset":11598},"indent":[]}},{"type":"text","value":" 和 ","position":{"start":{"line":341,"column":24,"offset":11598},"end":{"line":341,"column":27,"offset":11601},"indent":[]}},{"type":"html","value":"<code class=\"language-text\">mouseleave</code>","position":{"start":{"line":341,"column":27,"offset":11601},"end":{"line":341,"column":39,"offset":11613},"indent":[]}},{"type":"text","value":" 事件,触发相关边的状态变化。","position":{"start":{"line":341,"column":39,"offset":11613},"end":{"line":341,"column":54,"offset":11628},"indent":[]}}],"position":{"start":{"line":341,"column":3,"offset":11577},"end":{"line":341,"column":54,"offset":11628},"indent":[]}}],"position":{"start":{"line":341,"column":1,"offset":11575},"end":{"line":341,"column":54,"offset":11628},"indent":[]}}],"position":{"start":{"line":340,"column":1,"offset":11531},"end":{"line":341,"column":54,"offset":11628},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"下面代码节选自 demo ","position":{"start":{"line":343,"column":1,"offset":11630},"end":{"line":343,"column":14,"offset":11643},"indent":[]}},{"type":"link","title":null,"url":"https://antv.alipay.com/zh-cn/g6/3.x/demo/scatter/hover-animate.html","children":[{"type":"text","value":"状态切换动画","position":{"start":{"line":343,"column":15,"offset":11644},"end":{"line":343,"column":21,"offset":11650},"indent":[]}}],"position":{"start":{"line":343,"column":14,"offset":11643},"end":{"line":343,"column":92,"offset":11721},"indent":[]},"data":{"hProperties":{"target":"_self","rel":"nofollow"}}},{"type":"text","value":",请注意省略了部分代码,只展示了交互相关以及边动画相关的代码。","position":{"start":{"line":343,"column":92,"offset":11721},"end":{"line":343,"column":123,"offset":11752},"indent":[]}}],"position":{"start":{"line":343,"column":1,"offset":11630},"end":{"line":343,"column":123,"offset":11752},"indent":[]}},{"type":"html","lang":"javascript","meta":null,"value":"<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// const data = ...</span>\n<span class=\"token comment\">// const graph = new G6.Graph({...});</span>\n\n<span class=\"token comment\">// lineDash 的差值,可以在后面提供 util 方法自动计算</span>\n<span class=\"token keyword\">const</span> dashArray <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> lineDash <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> interval <span class=\"token operator\">=</span> <span class=\"token number\">9</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// lineDash 的总长度。</span>\n\n<span class=\"token comment\">// 注册名为 'can-running' 的边</span>\n<span class=\"token constant\">G6</span><span class=\"token punctuation\">.</span><span class=\"token function\">registerEdge</span><span class=\"token punctuation\">(</span>\n <span class=\"token string\">'can-running'</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 复写setState方法</span>\n <span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">,</span> item</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">const</span> shape <span class=\"token operator\">=</span> item<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'keyShape'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 监听 running 状态</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'running'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// running 状态为 true 时</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">const</span> length <span class=\"token operator\">=</span> shape<span class=\"token punctuation\">.</span><span class=\"token function\">getTotalLength</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">let</span> totalArray <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\"><</span> length<span class=\"token punctuation\">;</span> i <span class=\"token operator\">+=</span> interval<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n totalArray <span class=\"token operator\">=</span> totalArray<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>lineDash<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n <span class=\"token keyword\">let</span> index <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n shape<span class=\"token punctuation\">.</span><span class=\"token function\">animate</span><span class=\"token punctuation\">(</span>\n <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 动画重复</span>\n repeat<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n <span class=\"token comment\">// 每一帧的操作,入参 ratio:这一帧的比例值(Number)。返回值:这一帧需要变化的参数集(Object)。</span>\n <span class=\"token function\">onFrame</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ratio</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">const</span> cfg <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n lineDash<span class=\"token punctuation\">:</span> dashArray<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>totalArray<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n index <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> interval<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">return</span> cfg<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token number\">3000</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 一次动画的时长为 3000</span>\n <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// running 状态为 false 时</span>\n <span class=\"token comment\">// 结束动画</span>\n shape<span class=\"token punctuation\">.</span><span class=\"token function\">stopAnimate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 清空 lineDash</span>\n shape<span class=\"token punctuation\">.</span><span class=\"token function\">attr</span><span class=\"token punctuation\">(</span><span class=\"token string\">'lineDash'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n <span class=\"token string\">'cubic-horizontal'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 该自定义边继承了内置横向三阶贝塞尔曲线边 cubic-horizontal</span>\n\n<span class=\"token comment\">// 监听节点的 mouseenter 事件</span>\ngraph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:mouseenter'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">ev</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 获得当前鼠标操作的目标节点</span>\n <span class=\"token keyword\">const</span> node <span class=\"token operator\">=</span> ev<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 获得目标节点的所有相关边</span>\n <span class=\"token keyword\">const</span> edges <span class=\"token operator\">=</span> node<span class=\"token punctuation\">.</span><span class=\"token function\">getEdges</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 将所有相关边的 running 状态置为 true,此时将会触发自定义节点的 setState 函数</span>\n edges<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">edge</span> <span class=\"token operator\">=></span> graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>edge<span class=\"token punctuation\">,</span> <span class=\"token string\">'running'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 监听节点的 mouseleave 事件</span>\ngraph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:mouseleave'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">ev</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// 获得当前鼠标操作的目标节点</span>\n <span class=\"token keyword\">const</span> node <span class=\"token operator\">=</span> ev<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 获得目标节点的所有相关边</span>\n <span class=\"token keyword\">const</span> edges <span class=\"token operator\">=</span> node<span class=\"token punctuation\">.</span><span class=\"token function\">getEdges</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token comment\">// 将所有相关边的 running 状态置为 false,此时将会触发自定义节点的 setState 函数</span>\n edges<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">edge</span> <span class=\"token operator\">=></span> graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>edge<span class=\"token punctuation\">,</span> <span class=\"token string\">'running'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// graph.data(data);</span>\n<span class=\"token comment\">// graph.render();</span>\n</code></pre></div>","position":{"start":{"line":344,"column":1,"offset":11753},"end":{"line":423,"column":4,"offset":13740},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"html","value":"<span style=\"background-color: rgb(251, 233, 231); color: rgb(139, 53, 56)\">","position":{"start":{"line":425,"column":1,"offset":13742},"end":{"line":425,"column":77,"offset":13818},"indent":[]}},{"type":"text","value":" ","position":{"start":{"line":425,"column":77,"offset":13818},"end":{"line":425,"column":78,"offset":13819},"indent":[]}},{"type":"text","value":" ","position":{"start":{"line":425,"column":78,"offset":13819},"end":{"line":425,"column":84,"offset":13825},"indent":[]}},{"type":"text","value":" ","position":{"start":{"line":425,"column":84,"offset":13825},"end":{"line":425,"column":90,"offset":13831},"indent":[]}},{"type":"text","value":"注意:","position":{"start":{"line":425,"column":90,"offset":13831},"end":{"line":425,"column":93,"offset":13834},"indent":[]}},{"type":"html","value":"</span>","position":{"start":{"line":425,"column":93,"offset":13834},"end":{"line":425,"column":100,"offset":13841},"indent":[]}},{"type":"text","value":"\nrunning 为 false 时,要停止动画,同时把 lineDash 清空。","position":{"start":{"line":425,"column":100,"offset":13841},"end":{"line":426,"column":41,"offset":13882},"indent":[1]}}],"position":{"start":{"line":425,"column":1,"offset":13742},"end":{"line":426,"column":41,"offset":13882},"indent":[1]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":428,"column":1,"offset":13884}}}}