动画是在AnimateLayer动画层,播放节点和连线时间线上的不同状态。

一、播放流程

topology动画播放过程 (1).png

播放动画方式一

预览时自动播放,设置节点/连线的animatePlay属性即可。

播放动画方式二

// 修改动画帧数组,需要先准备动画数据环境
0. pen.initAnimate();

  1. 播放动画: pen.startAnimate();
  2. 暂停动画: pen.pauseAnimate();
  3. 停止动画: pen.stopAnimate(); // 停止动画指下次从0开始播放

每次代码调整过node.animateFrames,可能需要执行node.initAnimate(),恢复到初始状态

不要在for循环中执行上面操作

播放动画方式三

// 标记一组节点为相同tag
topology.animateLayer.readyPlay(tag);
topology.animateLayer.animate();

播放动画方式四

for(…) {
pen.animateStart = Date.now();
}
topology.animateLayer.readyPlay();
topology.animateLayer.animate();

二、节点动画

节点动画用帧表示,帧的数据为Node的animateFrames。

animateFrames

名称 类型 是否必选 描述
duration number 当前帧播放时长
start number 动画层添加节点AnimateLayer.addNode自动计算。相对于整个动画时长,当前帧在什么时候播放。
end number 动画层添加节点AnimateLayer.addNode自动计算。相对于整个动画时长,当前帧在什么时候结束。
state Node 当前帧,节点显示状态
linear boolean 动画属性是否线性变化
initState Node 当前帧播放前,初始状态。

自动计算。

如何设置节点动画

  1. // 1. 设置node.animateFrames
  2. // 复制当前节点状态
  3. const state = Node.cloneState(node);
  4. // 修改状态位置
  5. state.rect.y -= 10;
  6. state.rect.ey -= 10;
  7. node.animateFrames.push({
  8. duration: 100,
  9. linear: true,
  10. state
  11. });
  12. // 回到初始状态
  13. const state2 = Node.cloneState(node);
  14. node.animateFrames.push({
  15. duration: 100,
  16. linear: true,
  17. state: state2
  18. });
  19. node.animateDuration = 0;
  20. for (const item of node.animateFrames) {
  21. node.animateDuration += item.duration;
  22. }
  23. // 修改动画帧数组,需要先准备动画数据环境
  24. node.initAnimate();
  25. // A 开始播放
  26. node.startAnimate();
  27. // B 停止播放
  28. node.stopAnimate();
  1. // 参考源码中的函数:
  2. onChangeAnimate() {
  3. if (this.props.data.animateType === 'custom') {
  4. return;
  5. }
  6. this.props.data.animateFrames = [];
  7. const state = Node.cloneState(this.props.data);
  8. switch (this.props.data.animateType) {
  9. case 'upDown':
  10. state.rect.y -= 10;
  11. state.rect.ey -= 10;
  12. this.props.data.animateFrames.push({
  13. duration: 100,
  14. linear: true,
  15. state
  16. });
  17. this.props.data.animateFrames.push({
  18. duration: 100,
  19. linear: true,
  20. state: Node.cloneState(this.props.data)
  21. });
  22. this.props.data.animateFrames.push({
  23. duration: 200,
  24. linear: true,
  25. state: Node.cloneState(state)
  26. });
  27. break;
  28. case 'leftRight':
  29. state.rect.x -= 10;
  30. state.rect.ex -= 10;
  31. this.props.data.animateFrames.push({
  32. duration: 100,
  33. linear: true,
  34. state: Node.cloneState(state)
  35. });
  36. state.rect.x += 20;
  37. state.rect.ex += 20;
  38. this.props.data.animateFrames.push({
  39. duration: 80,
  40. linear: true,
  41. state: Node.cloneState(state)
  42. });
  43. state.rect.x -= 20;
  44. state.rect.ex -= 20;
  45. this.props.data.animateFrames.push({
  46. duration: 50,
  47. linear: true,
  48. state: Node.cloneState(state)
  49. });
  50. state.rect.x += 20;
  51. state.rect.ex += 20;
  52. this.props.data.animateFrames.push({
  53. duration: 30,
  54. linear: true,
  55. state: Node.cloneState(state)
  56. });
  57. this.props.data.animateFrames.push({
  58. duration: 300,
  59. linear: true,
  60. state: Node.cloneState(this.props.data)
  61. });
  62. break;
  63. case 'heart':
  64. state.rect.x -= 5;
  65. state.rect.ex += 5;
  66. state.rect.y -= 5;
  67. state.rect.ey += 5;
  68. state.rect.width += 5;
  69. state.rect.height += 10;
  70. this.props.data.animateFrames.push({
  71. duration: 100,
  72. linear: true,
  73. state
  74. });
  75. this.props.data.animateFrames.push({
  76. duration: 400,
  77. linear: true,
  78. state: Node.cloneState(this.props.data)
  79. });
  80. break;
  81. case 'success':
  82. state.strokeStyle = '#237804';
  83. this.props.data.animateFrames.push({
  84. duration: 100,
  85. linear: true,
  86. state
  87. });
  88. this.props.data.animateFrames.push({
  89. duration: 100,
  90. linear: true,
  91. state: Node.cloneState(this.props.data)
  92. });
  93. state.strokeStyle = '#237804';
  94. this.props.data.animateFrames.push({
  95. duration: 100,
  96. linear: true,
  97. state
  98. });
  99. this.props.data.animateFrames.push({
  100. duration: 100,
  101. linear: true,
  102. state: Node.cloneState(this.props.data)
  103. });
  104. state.strokeStyle = '#237804';
  105. state.fillStyle = '#389e0d22';
  106. this.props.data.animateFrames.push({
  107. duration: 3000,
  108. linear: true,
  109. state
  110. });
  111. break;
  112. case 'warning':
  113. state.strokeStyle = '#fa8c16';
  114. state.dash = 2;
  115. this.props.data.animateFrames.push({
  116. duration: 300,
  117. linear: true,
  118. state
  119. });
  120. state.strokeStyle = '#fa8c16';
  121. state.dash = 0;
  122. this.props.data.animateFrames.push({
  123. duration: 500,
  124. linear: true,
  125. state: Node.cloneState(state)
  126. });
  127. state.strokeStyle = '#fa8c16';
  128. state.dash = 2;
  129. this.props.data.animateFrames.push({
  130. duration: 300,
  131. linear: true,
  132. state: Node.cloneState(state)
  133. });
  134. break;
  135. case 'error':
  136. state.strokeStyle = '#cf1322';
  137. state.fillStyle = '#cf132222';
  138. this.props.data.animateFrames.push({
  139. duration: 100,
  140. linear: true,
  141. state
  142. });
  143. break;
  144. case 'show':
  145. state.strokeStyle = '#fa541c';
  146. state.rotate = -10;
  147. this.props.data.animateFrames.push({
  148. duration: 100,
  149. linear: true,
  150. state: Node.cloneState(state)
  151. });
  152. state.rotate = 10;
  153. this.props.data.animateFrames.push({
  154. duration: 100,
  155. linear: true,
  156. state: Node.cloneState(state)
  157. });
  158. state.rotate = 0;
  159. this.props.data.animateFrames.push({
  160. duration: 100,
  161. linear: true,
  162. state: Node.cloneState(state)
  163. });
  164. break;
  165. }
  166. this.onAnimateDuration();
  167. }

三、连线动画

连线动画,目前仅为从起点到终点的动态流量显示。

连线动画属性

名称 类型 是否必选 描述
animateColor string 动画颜色
animateSpan number 连线动画移动大小,像素
animateType string 来自于pen。动画播放类型:
空(默认),
beads(水珠流动),
dot(圆点),
comet(彗星)
animatePos number 动画当前位置,自动计算。
  1. // 1. 设置动画类型,默认
  2. line.animateType = '';
  3. // A 开始播放
  4. node.startAnimate();
  5. // B 停止播放
  6. node.stopAnimate();

四、自动播放动画

设置节点/连线的animatePlay属性即可。canvas.open的时候,就好自动播放。

五、自动播放下一个动画

置节点/连线的nextAnimate属性值为下一个节点/连线的tags数组中的一个值。此节点/连线动画播放结束时,自动播放下一个动画。

六、动画时长

节点的动画时长由动画帧数组决定;连线的动画时长与连线长度和播放速度animateSpan有关。