@visactor/vrender-animate 0.23.0-alpha.2 → 0.23.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/cjs/animate-extension.d.ts +11 -3
  2. package/cjs/animate-extension.js +26 -11
  3. package/cjs/animate-extension.js.map +1 -1
  4. package/cjs/animate.js +5 -3
  5. package/cjs/animate.js.map +1 -1
  6. package/cjs/component/component-animate-extension.d.ts +1 -0
  7. package/cjs/component/component-animate-extension.js +1 -0
  8. package/cjs/component/component-animate-extension.js.map +1 -0
  9. package/cjs/component/component-animator.d.ts +21 -0
  10. package/cjs/component/component-animator.js +81 -0
  11. package/cjs/component/component-animator.js.map +1 -0
  12. package/cjs/component/index.d.ts +1 -0
  13. package/cjs/component/index.js +21 -0
  14. package/cjs/component/index.js.map +1 -0
  15. package/cjs/custom/common.js +9 -6
  16. package/cjs/custom/common.js.map +1 -1
  17. package/cjs/custom/custom-animate.d.ts +6 -0
  18. package/cjs/custom/custom-animate.js +12 -1
  19. package/cjs/custom/custom-animate.js.map +1 -1
  20. package/cjs/custom/group-fade.js +1 -2
  21. package/cjs/custom/growAngle.d.ts +8 -3
  22. package/cjs/custom/growAngle.js +27 -14
  23. package/cjs/custom/growAngle.js.map +1 -1
  24. package/cjs/custom/growCenter.js +9 -6
  25. package/cjs/custom/growCenter.js.map +1 -1
  26. package/cjs/custom/growHeight.js +11 -7
  27. package/cjs/custom/growHeight.js.map +1 -1
  28. package/cjs/custom/growPoints.js +13 -11
  29. package/cjs/custom/growPoints.js.map +1 -1
  30. package/cjs/custom/growRadius.js +15 -12
  31. package/cjs/custom/growRadius.js.map +1 -1
  32. package/cjs/custom/growWidth.js +9 -6
  33. package/cjs/custom/growWidth.js.map +1 -1
  34. package/cjs/custom/label-animate.d.ts +4 -0
  35. package/cjs/custom/label-animate.js +48 -0
  36. package/cjs/custom/label-animate.js.map +1 -0
  37. package/cjs/custom/label-item-animate.d.ts +7 -0
  38. package/cjs/custom/label-item-animate.js +219 -0
  39. package/cjs/custom/label-item-animate.js.map +1 -0
  40. package/cjs/custom/poptip-animate.d.ts +7 -0
  41. package/cjs/custom/poptip-animate.js +106 -0
  42. package/cjs/custom/poptip-animate.js.map +1 -0
  43. package/cjs/custom/register.js +8 -2
  44. package/cjs/custom/register.js.map +1 -1
  45. package/cjs/custom/scale.d.ts +4 -0
  46. package/cjs/custom/scale.js +30 -21
  47. package/cjs/custom/scale.js.map +1 -1
  48. package/cjs/custom/tag-points.js +1 -2
  49. package/cjs/custom/update.d.ts +0 -1
  50. package/cjs/custom/update.js +1 -1
  51. package/cjs/custom/update.js.map +1 -1
  52. package/cjs/executor/animate-executor.d.ts +2 -2
  53. package/cjs/executor/animate-executor.js +43 -27
  54. package/cjs/executor/animate-executor.js.map +1 -1
  55. package/cjs/executor/executor.d.ts +3 -0
  56. package/cjs/executor/executor.js.map +1 -1
  57. package/cjs/index.d.ts +2 -0
  58. package/cjs/index.js +1 -1
  59. package/cjs/index.js.map +1 -1
  60. package/cjs/interpolate/store.d.ts +2 -0
  61. package/cjs/interpolate/store.js +5 -2
  62. package/cjs/interpolate/store.js.map +1 -1
  63. package/cjs/intreface/animate.d.ts +1 -0
  64. package/cjs/intreface/animate.js.map +1 -1
  65. package/cjs/intreface/ticker.js +2 -1
  66. package/cjs/register.js +1 -5
  67. package/cjs/register.js.map +1 -1
  68. package/cjs/state/animation-state.d.ts +18 -0
  69. package/cjs/state/animation-state.js +45 -1
  70. package/cjs/state/animation-state.js.map +1 -1
  71. package/cjs/state/graphic-extension.d.ts +6 -0
  72. package/cjs/state/graphic-extension.js +20 -0
  73. package/cjs/state/graphic-extension.js.map +1 -1
  74. package/cjs/step.d.ts +1 -0
  75. package/cjs/step.js +14 -8
  76. package/cjs/step.js.map +1 -1
  77. package/cjs/ticker/default-ticker.d.ts +8 -3
  78. package/cjs/ticker/default-ticker.js +22 -22
  79. package/cjs/ticker/default-ticker.js.map +1 -1
  80. package/cjs/utils/easing-func.js +1 -2
  81. package/dist/index.es.js +853 -184
  82. package/es/animate-extension.d.ts +11 -3
  83. package/es/animate-extension.js +27 -10
  84. package/es/animate-extension.js.map +1 -1
  85. package/es/animate.js +5 -3
  86. package/es/animate.js.map +1 -1
  87. package/es/component/component-animate-extension.d.ts +1 -0
  88. package/es/component/component-animate-extension.js +1 -0
  89. package/es/component/component-animate-extension.js.map +1 -0
  90. package/es/component/component-animator.d.ts +21 -0
  91. package/es/component/component-animator.js +73 -0
  92. package/es/component/component-animator.js.map +1 -0
  93. package/es/component/index.d.ts +1 -0
  94. package/es/component/index.js +2 -0
  95. package/es/component/index.js.map +1 -0
  96. package/es/custom/common.js +9 -6
  97. package/es/custom/common.js.map +1 -1
  98. package/es/custom/custom-animate.d.ts +6 -0
  99. package/es/custom/custom-animate.js +9 -0
  100. package/es/custom/custom-animate.js.map +1 -1
  101. package/es/custom/group-fade.js +1 -2
  102. package/es/custom/growAngle.d.ts +8 -3
  103. package/es/custom/growAngle.js +25 -12
  104. package/es/custom/growAngle.js.map +1 -1
  105. package/es/custom/growCenter.js +9 -6
  106. package/es/custom/growCenter.js.map +1 -1
  107. package/es/custom/growHeight.js +11 -7
  108. package/es/custom/growHeight.js.map +1 -1
  109. package/es/custom/growPoints.js +12 -11
  110. package/es/custom/growPoints.js.map +1 -1
  111. package/es/custom/growRadius.js +15 -12
  112. package/es/custom/growRadius.js.map +1 -1
  113. package/es/custom/growWidth.js +9 -6
  114. package/es/custom/growWidth.js.map +1 -1
  115. package/es/custom/label-animate.d.ts +4 -0
  116. package/es/custom/label-animate.js +42 -0
  117. package/es/custom/label-animate.js.map +1 -0
  118. package/es/custom/label-item-animate.d.ts +7 -0
  119. package/es/custom/label-item-animate.js +213 -0
  120. package/es/custom/label-item-animate.js.map +1 -0
  121. package/es/custom/poptip-animate.d.ts +7 -0
  122. package/es/custom/poptip-animate.js +100 -0
  123. package/es/custom/poptip-animate.js.map +1 -0
  124. package/es/custom/register.js +24 -12
  125. package/es/custom/register.js.map +1 -1
  126. package/es/custom/scale.d.ts +4 -0
  127. package/es/custom/scale.js +30 -21
  128. package/es/custom/scale.js.map +1 -1
  129. package/es/custom/tag-points.js +1 -2
  130. package/es/custom/update.d.ts +0 -1
  131. package/es/custom/update.js +1 -1
  132. package/es/custom/update.js.map +1 -1
  133. package/es/executor/animate-executor.d.ts +2 -2
  134. package/es/executor/animate-executor.js +43 -27
  135. package/es/executor/animate-executor.js.map +1 -1
  136. package/es/executor/executor.d.ts +3 -0
  137. package/es/executor/executor.js.map +1 -1
  138. package/es/index.d.ts +2 -0
  139. package/es/index.js +2 -0
  140. package/es/index.js.map +1 -1
  141. package/es/interpolate/store.d.ts +2 -0
  142. package/es/interpolate/store.js +5 -3
  143. package/es/interpolate/store.js.map +1 -1
  144. package/es/intreface/animate.d.ts +1 -0
  145. package/es/intreface/animate.js.map +1 -1
  146. package/es/intreface/ticker.js +2 -1
  147. package/es/register.js +0 -8
  148. package/es/register.js.map +1 -1
  149. package/es/state/animation-state.d.ts +18 -0
  150. package/es/state/animation-state.js +44 -0
  151. package/es/state/animation-state.js.map +1 -1
  152. package/es/state/graphic-extension.d.ts +6 -0
  153. package/es/state/graphic-extension.js +20 -0
  154. package/es/state/graphic-extension.js.map +1 -1
  155. package/es/step.d.ts +1 -0
  156. package/es/step.js +14 -8
  157. package/es/step.js.map +1 -1
  158. package/es/ticker/default-ticker.d.ts +8 -3
  159. package/es/ticker/default-ticker.js +22 -22
  160. package/es/ticker/default-ticker.js.map +1 -1
  161. package/es/utils/easing-func.js +1 -2
  162. package/package.json +2 -2
package/es/step.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import { ColorStore, ColorType, type IGraphic } from '@visactor/vrender-core';\nimport type { IAnimate, IStep } from './intreface/animate';\nimport type { EasingType, EasingTypeFunc } from './intreface/easing';\nimport type { IAnimateStepType } from './intreface/type';\nimport { Easing } from './utils/easing';\nimport { commonInterpolateUpdate, interpolateUpdateStore } from './interpolate/store';\nimport { isString } from '@visactor/vutils';\n\nfunction noop() {\n //...\n}\n\nexport class Step implements IStep {\n type: IAnimateStepType;\n prev?: IStep;\n duration: number;\n next?: IStep;\n props?: Record<string, any>;\n propKeys?: string[];\n interpolateUpdateFunctions?: ((\n key: string,\n from: number,\n to: number,\n ratio: number,\n step: IStep,\n target: IGraphic\n ) => void)[];\n easing: EasingTypeFunc;\n animate: IAnimate;\n target: IGraphic;\n fromProps: Record<string, any>;\n fromParsedProps: Record<string, any>;\n toParsedProps: Record<string, any>;\n\n // 内部状态\n protected _startTime: number = 0;\n _hasFirstRun: boolean = false;\n\n protected _endCb?: (animate: IAnimate, step: IStep) => void;\n\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n this.type = type;\n this.props = props;\n this.duration = duration;\n // 设置缓动函数\n if (easing) {\n this.easing = typeof easing === 'function' ? easing : Easing[easing];\n } else {\n this.easing = Easing.linear;\n }\n if (type === 'wait') {\n this.onUpdate = noop;\n }\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n }\n\n append(step: IStep): void {\n this.next = step;\n step.prev = this;\n\n // 更新绝对时间\n step.setStartTime(this.getStartTime() + this.duration, false);\n }\n\n // 更新下游节点的开始时间\n private updateDownstreamStartTimes(): void {\n let currentStep = this.next;\n let currentStartTime = this._startTime + this.duration;\n\n while (currentStep) {\n currentStep.setStartTime(currentStartTime, false);\n currentStartTime += currentStep.duration;\n currentStep = currentStep.next;\n }\n this.animate.updateDuration();\n }\n\n getLastProps(): any {\n if (this.prev) {\n return this.prev.props || {};\n }\n return this.animate.getStartProps();\n }\n\n setDuration(duration: number, updateDownstream: boolean = true): void {\n this.duration = duration;\n\n // 如果有后续节点,更新所有后续节点的开始时间\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n determineInterpolateUpdateFunction(): void {\n // 根据属性类型确定插值更新函数\n // 这里可以进行优化,例如缓存不同类型属性的插值更新函数\n if (!this.props) {\n return;\n }\n\n const funcs: ((key: string, from: number, to: number, ratio: number, step: IStep, target: IGraphic) => void)[] = [];\n this.propKeys.forEach(key => {\n // 普通颜色特殊处理,需要提前解析成number[]\n if (key === 'fill' || key === 'stroke') {\n const from = this.getLastProps()[key];\n const to = this.props[key];\n if (isString(from) && isString(to)) {\n const fromArray = ColorStore.Get(from, ColorType.Color255);\n const toArray = ColorStore.Get(to, ColorType.Color255);\n if (!this.fromParsedProps) {\n this.fromParsedProps = {};\n }\n if (!this.toParsedProps) {\n this.toParsedProps = {};\n }\n this.fromParsedProps[key] = fromArray;\n this.toParsedProps[key] = toArray;\n }\n funcs.push((interpolateUpdateStore as any)[key === 'fill' ? 'fillPure' : 'strokePure']);\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n });\n this.interpolateUpdateFunctions = funcs;\n }\n\n setStartTime(time: number, updateDownstream: boolean = true): void {\n this._startTime = time;\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getStartTime(): number {\n return this._startTime;\n }\n\n onBind(): void {\n // 在第一次绑定到Animate的时候触发\n }\n\n /**\n * 首次运行逻辑\n * 如果跳帧了就不一定会执行\n */\n onFirstRun(): void {\n // 首次运行逻辑\n }\n\n /**\n * 开始执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onStart(): void {\n if (!this._hasFirstRun) {\n this._hasFirstRun = true;\n // 获取上一步的属性值作为起始值\n this.fromProps = this.getLastProps();\n this.determineInterpolateUpdateFunction();\n this.tryPreventConflict();\n this.trySyncStartProps();\n this.onFirstRun();\n }\n }\n\n protected tryPreventConflict(): void {\n // 屏蔽掉之前动画冲突的属性\n const animate = this.animate;\n const target = this.target;\n target.animates.forEach((a: any) => {\n if (a === animate || a.priority > animate.priority) {\n return;\n }\n const fromProps = a.getStartProps();\n this.propKeys.forEach(key => {\n if (fromProps[key] != null) {\n a.preventAttr(key);\n }\n });\n });\n }\n\n /**\n * 删除自身属性,会直接从props等内容里删除掉\n */\n deleteSelfAttr(key: string): void {\n delete this.props[key];\n // fromProps在动画开始时才会计算,这时可能不在\n this.fromProps && delete this.fromProps[key];\n const index = this.propKeys.indexOf(key);\n if (index !== -1) {\n this.propKeys.splice(index, 1);\n this.interpolateUpdateFunctions?.splice(index, 1);\n }\n }\n\n /**\n * 尝试同步startProps,因为当前animate的startProps仅包含当前animate的信息,不排除过程中有其他animate的干扰\n * 所以为了避免属性突变,需要确保startProps的属性值是最新的\n */\n trySyncStartProps(): void {\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.animate.target.getComputedAttribute(key);\n });\n }\n\n /**\n * 更新执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n // TODO 需要修复,只有在开始的时候才调用\n this.onStart();\n if (!this.props || !this.propKeys) {\n return;\n }\n // 应用缓动函数\n const easedRatio = this.easing(ratio);\n this.animate.interpolateUpdateFunction\n ? this.animate.interpolateUpdateFunction(this.fromProps, this.props, easedRatio, this, this.target)\n : this.interpolateUpdateFunctions.forEach((func, index) => {\n // 如果这个属性被屏蔽了,直接跳过\n if (!this.animate.validAttr(this.propKeys[index])) {\n return;\n }\n const key = this.propKeys[index];\n const fromValue = this.fromProps[key];\n const toValue = this.props[key];\n func(key, fromValue, toValue, easedRatio, this, this.target);\n });\n this.onUpdate(end, easedRatio, out);\n }\n\n onUpdate(end: boolean, ratio: number, out: Record<string, any>): void {\n // ...\n }\n\n /**\n * 结束执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onEnd(cb?: (animate: IAnimate, step: IStep) => void): void {\n if (cb) {\n this._endCb = cb;\n } else if (this._endCb) {\n this.target.setAttributes(this.props);\n this._endCb(this.animate, this);\n }\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的\n * @returns\n */\n getEndProps(): Record<string, any> {\n return this.props;\n }\n\n /**\n * 获取开始的属性,是前序的终值\n * @returns\n */\n getFromProps(): Record<string, any> {\n return this.fromProps;\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的,同getEndProps\n * @returns\n */\n getMergedEndProps(): Record<string, any> | void {\n return this.getEndProps();\n }\n}\n\nexport class WaitStep extends Step {\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n super(type, props, duration, easing);\n }\n\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n this.onStart();\n // 其他的不执行\n }\n\n determineInterpolateUpdateFunction(): void {\n return;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import { ColorStore, ColorType, type IGraphic } from '@visactor/vrender-core';\nimport type { IAnimate, IStep } from './intreface/animate';\nimport type { EasingType, EasingTypeFunc } from './intreface/easing';\nimport type { IAnimateStepType } from './intreface/type';\nimport { Easing } from './utils/easing';\nimport { commonInterpolateUpdate, interpolateUpdateStore } from './interpolate/store';\nimport { isString } from '@visactor/vutils';\n\nfunction noop() {\n //...\n}\n\nexport class Step implements IStep {\n type: IAnimateStepType;\n prev?: IStep;\n duration: number;\n next?: IStep;\n props?: Record<string, any>;\n propKeys?: string[];\n interpolateUpdateFunctions?: ((\n key: string,\n from: number,\n to: number,\n ratio: number,\n step: IStep,\n target: IGraphic\n ) => void)[];\n easing: EasingTypeFunc;\n animate: IAnimate;\n target: IGraphic;\n fromProps: Record<string, any>;\n fromParsedProps: Record<string, any>;\n toParsedProps: Record<string, any>;\n\n // 内部状态\n protected _startTime: number = 0;\n _hasFirstRun: boolean = false;\n\n protected _endCb?: (animate: IAnimate, step: IStep) => void;\n\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n this.type = type;\n this.props = props;\n this.duration = duration;\n // 设置缓动函数\n if (easing) {\n this.easing = typeof easing === 'function' ? easing : Easing[easing];\n } else {\n this.easing = Easing.linear;\n }\n if (type === 'wait') {\n this.onUpdate = noop;\n }\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n }\n\n append(step: IStep): void {\n this.next = step;\n step.prev = this;\n\n // 更新绝对时间\n step.setStartTime(this.getStartTime() + this.duration, false);\n }\n\n // 更新下游节点的开始时间\n private updateDownstreamStartTimes(): void {\n let currentStep = this.next;\n let currentStartTime = this._startTime + this.duration;\n\n while (currentStep) {\n currentStep.setStartTime(currentStartTime, false);\n currentStartTime += currentStep.duration;\n currentStep = currentStep.next;\n }\n this.animate.updateDuration();\n }\n\n getLastProps(): any {\n if (this.prev) {\n return this.prev.props || {};\n }\n return this.animate.getStartProps();\n }\n\n setDuration(duration: number, updateDownstream: boolean = true): void {\n this.duration = duration;\n\n // 如果有后续节点,更新所有后续节点的开始时间\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n determineInterpolateUpdateFunction(): void {\n // 根据属性类型确定插值更新函数\n // 这里可以进行优化,例如缓存不同类型属性的插值更新函数\n if (!this.props) {\n return;\n }\n\n const funcs: ((key: string, from: number, to: number, ratio: number, step: IStep, target: IGraphic) => void)[] = [];\n this.propKeys.forEach(key => {\n // 普通颜色特殊处理,需要提前解析成number[]\n if (key === 'fill' || key === 'stroke') {\n const from = this.fromProps[key];\n const to = this.props[key];\n if (isString(from) && isString(to)) {\n const fromArray = ColorStore.Get(from, ColorType.Color255);\n const toArray = ColorStore.Get(to, ColorType.Color255);\n if (!this.fromParsedProps) {\n this.fromParsedProps = {};\n }\n if (!this.toParsedProps) {\n this.toParsedProps = {};\n }\n this.fromParsedProps[key] = fromArray;\n this.toParsedProps[key] = toArray;\n funcs.push((interpolateUpdateStore as any)[key === 'fill' ? 'fillPure' : 'strokePure']);\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n });\n this.interpolateUpdateFunctions = funcs;\n }\n\n setStartTime(time: number, updateDownstream: boolean = true): void {\n this._startTime = time;\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getStartTime(): number {\n return this._startTime;\n }\n\n onBind(): void {\n // 在第一次绑定到Animate的时候触发\n }\n\n /**\n * 首次运行逻辑\n * 如果跳帧了就不一定会执行\n */\n onFirstRun(): void {\n // 首次运行逻辑\n }\n\n /**\n * 开始执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onStart(): void {\n if (!this._hasFirstRun) {\n this._hasFirstRun = true;\n // 获取上一步的属性值作为起始值\n this.fromProps = this.getLastProps();\n const startProps = this.animate.getStartProps();\n this.propKeys &&\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.fromProps[key] ?? startProps[key];\n });\n this.determineInterpolateUpdateFunction();\n this.tryPreventConflict();\n this.trySyncStartProps();\n this.onFirstRun();\n }\n }\n\n protected tryPreventConflict(): void {\n // 屏蔽掉之前动画冲突的属性\n const animate = this.animate;\n const target = this.target;\n target.animates.forEach((a: any) => {\n if (a === animate || a.priority > animate.priority) {\n return;\n }\n const fromProps = a.getStartProps();\n this.propKeys.forEach(key => {\n if (fromProps[key] != null) {\n a.preventAttr(key);\n }\n });\n });\n }\n\n /**\n * 删除自身属性,会直接从props等内容里删除掉\n */\n deleteSelfAttr(key: string): void {\n delete this.props[key];\n // fromProps在动画开始时才会计算,这时可能不在\n this.fromProps && delete this.fromProps[key];\n const index = this.propKeys.indexOf(key);\n if (index !== -1) {\n this.propKeys.splice(index, 1);\n this.interpolateUpdateFunctions?.splice(index, 1);\n }\n }\n\n /**\n * 尝试同步startProps,因为当前animate的startProps仅包含当前animate的信息,不排除过程中有其他animate的干扰\n * 所以为了避免属性突变,需要确保startProps的属性值是最新的\n */\n trySyncStartProps(): void {\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.animate.target.getComputedAttribute(key);\n });\n }\n\n /**\n * 更新执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n // TODO 需要修复,只有在开始的时候才调用\n this.onStart();\n if (!this.props || !this.propKeys) {\n return;\n }\n // 应用缓动函数\n const easedRatio = this.easing(ratio);\n this.animate.interpolateUpdateFunction\n ? this.animate.interpolateUpdateFunction(this.fromProps, this.props, easedRatio, this, this.target)\n : this.interpolateUpdateFunctions.forEach((func, index) => {\n // 如果这个属性被屏蔽了,直接跳过\n if (!this.animate.validAttr(this.propKeys[index])) {\n return;\n }\n const key = this.propKeys[index];\n const fromValue = this.fromProps[key];\n const toValue = this.props[key];\n func(key, fromValue, toValue, easedRatio, this, this.target);\n });\n this.onUpdate(end, easedRatio, out);\n }\n\n onUpdate(end: boolean, ratio: number, out: Record<string, any>): void {\n // ...\n }\n\n /**\n * 结束执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onEnd(cb?: (animate: IAnimate, step: IStep) => void): void {\n this.target.setAttributes(this.props);\n if (cb) {\n this._endCb = cb;\n } else if (this._endCb) {\n this._endCb(this.animate, this);\n }\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的\n * @returns\n */\n getEndProps(): Record<string, any> {\n return this.props;\n }\n\n /**\n * 获取开始的属性,是前序的终值\n * @returns\n */\n getFromProps(): Record<string, any> {\n return this.fromProps;\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的,同getEndProps\n * @returns\n */\n getMergedEndProps(): Record<string, any> | void {\n return this.getEndProps();\n }\n\n stop(): void {\n // ...\n }\n}\n\nexport class WaitStep extends Step {\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n super(type, props, duration, easing);\n }\n\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n this.onStart();\n // 其他的不执行\n }\n\n determineInterpolateUpdateFunction(): void {\n return;\n }\n}\n"]}
@@ -7,12 +7,16 @@ export declare class DefaultTicker extends EventEmitter implements ITicker {
7
7
  protected tickerHandler: ITickHandler;
8
8
  protected status: STATUS;
9
9
  protected lastFrameTime: number;
10
- protected lastExecutionTime: number;
11
10
  protected tickCounts: number;
12
11
  protected stage: IStage;
13
12
  timelines: ITimeline[];
14
13
  autoStop: boolean;
14
+ protected _jitter: number;
15
+ protected timeOffset: number;
16
+ _lastTickTime: number;
17
+ protected frameTimeHistory: number[];
15
18
  constructor(stage: IStage);
19
+ computeTimeOffsetAndJitter(): void;
16
20
  init(): void;
17
21
  addTimeline(timeline: ITimeline): void;
18
22
  remTimeline(timeline: ITimeline): void;
@@ -32,8 +36,9 @@ export declare class DefaultTicker extends EventEmitter implements ITicker {
32
36
  stop(): void;
33
37
  trySyncTickStatus(): void;
34
38
  release(): void;
39
+ protected checkSkip: (delta: number) => boolean;
35
40
  protected handleTick: (handler: ITickHandler, params?: {
36
41
  once?: boolean;
37
- }) => void;
38
- protected _handlerTick: () => void;
42
+ }) => boolean;
43
+ protected _handlerTick: (delta: number) => void;
39
44
  }
@@ -12,7 +12,7 @@ class RAFTickHandler {
12
12
  }
13
13
  tick(interval, cb) {
14
14
  performanceRAF.addAnimationFrameCb((() => {
15
- this.released || cb(this);
15
+ if (!this.released) return cb(this);
16
16
  }));
17
17
  }
18
18
  release() {
@@ -25,22 +25,25 @@ class RAFTickHandler {
25
25
 
26
26
  export class DefaultTicker extends EventEmitter {
27
27
  constructor(stage) {
28
- super(), this.interval = 16, this.lastFrameTime = -1, this.lastExecutionTime = -1,
29
- this.tickCounts = 0, this.timelines = [], this.autoStop = !0, this.handleTick = (handler, params) => {
28
+ super(), this.timelines = [], this.frameTimeHistory = [], this.checkSkip = delta => delta < this.interval + 2 * (Math.random() - .5) * this._jitter,
29
+ this.handleTick = (handler, params) => {
30
30
  const {once: once = !1} = null != params ? params : {};
31
- if (this.ifCanStop()) return void this.stop();
31
+ if (this.ifCanStop()) return this.stop(), !1;
32
32
  const currentTime = handler.getTime();
33
- (this.lastExecutionTime < 0 ? this.interval : currentTime - this.lastExecutionTime) >= this.interval && (this._handlerTick(),
34
- this.lastExecutionTime = currentTime), once || handler.tick(this.interval, this.handleTick);
35
- }, this._handlerTick = () => {
36
- const time = this.tickerHandler.getTime();
37
- let delta = 0;
38
- this.lastFrameTime >= 0 && (delta = time - this.lastFrameTime), this.lastFrameTime = time,
33
+ this._lastTickTime = currentTime, this.lastFrameTime < 0 && (this.lastFrameTime = currentTime - this.interval + this.timeOffset,
34
+ this.frameTimeHistory.push(this.lastFrameTime));
35
+ const delta = currentTime - this.lastFrameTime, skip = this.checkSkip(delta);
36
+ return skip || (this._handlerTick(delta), this.lastFrameTime = currentTime, this.frameTimeHistory.push(this.lastFrameTime)),
37
+ once || handler.tick(this.interval, this.handleTick), !skip;
38
+ }, this._handlerTick = delta => {
39
39
  this.status === STATUS.RUNNING && (this.tickCounts++, this.timelines.forEach((timeline => {
40
40
  timeline.tick(delta);
41
41
  })), this.emit("tick", delta));
42
- }, this.init(), this.lastFrameTime = -1, this.lastExecutionTime = -1, this.tickCounts = 0,
43
- this.stage = stage, this.autoStop = !0;
42
+ }, this.init(), this.lastFrameTime = -1, this.tickCounts = 0, this.stage = stage,
43
+ this.autoStop = !0, this.interval = 16, this.computeTimeOffsetAndJitter();
44
+ }
45
+ computeTimeOffsetAndJitter() {
46
+ this.timeOffset = Math.floor(Math.random() * this.interval), this._jitter = Math.min(Math.max(.2 * this.interval, 6), .7 * this.interval);
44
47
  }
45
48
  init() {
46
49
  this.interval = 16, this.status = STATUS.INITIAL, application.global.hooks.onSetEnv.tap("graph-ticker", (() => {
@@ -65,23 +68,21 @@ export class DefaultTicker extends EventEmitter {
65
68
  !0;
66
69
  }
67
70
  setInterval(interval) {
68
- this.interval = interval;
71
+ this.interval = interval, this.computeTimeOffsetAndJitter();
69
72
  }
70
73
  getInterval() {
71
74
  return this.interval;
72
75
  }
73
76
  setFPS(fps) {
74
- this.setInterval(1e3 / fps);
77
+ this.setInterval(Math.floor(1e3 / fps));
75
78
  }
76
79
  getFPS() {
77
80
  return 1e3 / this.interval;
78
81
  }
79
82
  tick(interval) {
80
- this.tickerHandler.tick(interval, (handler => {
81
- this.handleTick(handler, {
82
- once: !0
83
- });
84
- }));
83
+ this.tickerHandler.tick(interval, (handler => this.handleTick(handler, {
84
+ once: !0
85
+ })));
85
86
  }
86
87
  tickTo(t) {
87
88
  this.tickerHandler.tickTo && this.tickerHandler.tickTo(t, (handler => {
@@ -114,8 +115,7 @@ export class DefaultTicker extends EventEmitter {
114
115
  !0;
115
116
  }
116
117
  stop() {
117
- this.status = STATUS.INITIAL, this.setupTickHandler(), this.lastFrameTime = -1,
118
- this.lastExecutionTime = -1;
118
+ this.status = STATUS.INITIAL, this.setupTickHandler(), this.lastFrameTime = -1;
119
119
  }
120
120
  trySyncTickStatus() {
121
121
  this.status === STATUS.INITIAL && this.timelines.some((timeline => timeline.isRunning())) ? this.start() : this.status === STATUS.RUNNING && this.timelines.every((timeline => !timeline.isRunning())) && this.stop();
@@ -123,7 +123,7 @@ export class DefaultTicker extends EventEmitter {
123
123
  release() {
124
124
  var _a;
125
125
  this.stop(), this.timelines = [], null === (_a = this.tickerHandler) || void 0 === _a || _a.release(),
126
- this.tickerHandler = null, this.lastExecutionTime = -1;
126
+ this.tickerHandler = null, this.lastFrameTime = -1;
127
127
  }
128
128
  }
129
129
  //# sourceMappingURL=default-ticker.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ticker/default-ticker.ts"],"names":[],"mappings":"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","file":"default-ticker.js","sourcesContent":["import { EventEmitter } from '@visactor/vutils';\nimport type { IStage } from '@visactor/vrender-core';\nimport { application, PerformanceRAF } from '@visactor/vrender-core';\nimport { type ITickHandler, type ITicker, STATUS } from '../intreface/ticker';\nimport type { ITimeline } from '../intreface/timeline';\n\nconst performanceRAF = new PerformanceRAF();\n\nclass RAFTickHandler implements ITickHandler {\n protected released: boolean = false;\n\n tick(interval: number, cb: (handler: ITickHandler) => void): void {\n performanceRAF.addAnimationFrameCb(() => {\n if (this.released) {\n return;\n }\n cb(this);\n });\n }\n\n release(): void {\n this.released = true;\n }\n\n getTime(): number {\n return Date.now();\n }\n}\n\n/**\n * Graph-based Ticker implementation\n * This ticker works directly with GraphManager instances without needing timeline adapters\n */\nexport class DefaultTicker extends EventEmitter implements ITicker {\n protected interval: number = 16;\n protected tickerHandler: ITickHandler;\n protected status: STATUS;\n protected lastFrameTime: number = -1;\n protected lastExecutionTime: number = -1; // Track the last time we actually executed a frame\n protected tickCounts: number = 0;\n protected stage: IStage;\n timelines: ITimeline[] = [];\n autoStop: boolean = true;\n\n constructor(stage: IStage) {\n super();\n this.init();\n this.lastFrameTime = -1;\n this.lastExecutionTime = -1;\n this.tickCounts = 0;\n this.stage = stage;\n this.autoStop = true;\n }\n\n init(): void {\n this.interval = 16;\n this.status = STATUS.INITIAL;\n application.global.hooks.onSetEnv.tap('graph-ticker', () => {\n this.initHandler();\n });\n if (application.global.env) {\n this.initHandler();\n }\n }\n\n addTimeline(timeline: ITimeline): void {\n this.timelines.push(timeline);\n }\n\n remTimeline(timeline: ITimeline): void {\n this.timelines = this.timelines.filter(t => t !== timeline);\n }\n\n getTimelines(): ITimeline[] {\n return this.timelines;\n }\n\n protected initHandler() {\n this.setupTickHandler();\n }\n\n /**\n * Set up the tick handler\n * @returns true if setup was successful, false otherwise\n */\n protected setupTickHandler(): boolean {\n const handler: ITickHandler = new RAFTickHandler();\n\n // Destroy the previous tick handler\n if (this.tickerHandler) {\n this.tickerHandler.release();\n }\n\n this.tickerHandler = handler;\n return true;\n }\n\n setInterval(interval: number): void {\n this.interval = interval;\n }\n\n getInterval(): number {\n return this.interval;\n }\n\n setFPS(fps: number): void {\n this.setInterval(1000 / fps);\n }\n\n getFPS(): number {\n return 1000 / this.interval;\n }\n\n tick(interval: number): void {\n this.tickerHandler.tick(interval, (handler: ITickHandler) => {\n this.handleTick(handler, { once: true });\n });\n }\n\n tickTo(t: number): void {\n if (!this.tickerHandler.tickTo) {\n return;\n }\n this.tickerHandler.tickTo(t, (handler: ITickHandler) => {\n this.handleTick(handler, { once: true });\n });\n }\n\n pause(): boolean {\n if (this.status === STATUS.INITIAL) {\n return false;\n }\n this.status = STATUS.PAUSE;\n return true;\n }\n\n resume(): boolean {\n if (this.status === STATUS.INITIAL) {\n return false;\n }\n this.status = STATUS.RUNNING;\n return true;\n }\n\n ifCanStop(): boolean {\n if (this.autoStop) {\n if (!this.timelines.length) {\n return true;\n }\n if (this.timelines.every(timeline => !timeline.isRunning())) {\n return true;\n }\n }\n return false;\n }\n\n start(force: boolean = false): boolean {\n if (this.status === STATUS.RUNNING) {\n return false;\n }\n if (!this.tickerHandler) {\n return false;\n }\n\n // 暂停中、或者应该停止的时候,就不执行\n if (!force) {\n if (this.status === STATUS.PAUSE) {\n return false;\n }\n if (this.ifCanStop()) {\n return false;\n }\n }\n\n this.status = STATUS.RUNNING;\n this.tickerHandler.tick(0, this.handleTick);\n return true;\n }\n\n stop(): void {\n // Reset the tick handler\n this.status = STATUS.INITIAL;\n this.setupTickHandler();\n this.lastFrameTime = -1;\n this.lastExecutionTime = -1;\n }\n\n /**\n * 用于自动启动或停止\n * 基于当前的graph managers检查是否需要启动或停止\n */\n trySyncTickStatus(): void {\n if (this.status === STATUS.INITIAL && this.timelines.some(timeline => timeline.isRunning())) {\n this.start();\n } else if (this.status === STATUS.RUNNING && this.timelines.every(timeline => !timeline.isRunning())) {\n this.stop();\n }\n }\n\n release(): void {\n this.stop();\n this.timelines = [];\n this.tickerHandler?.release();\n this.tickerHandler = null;\n this.lastExecutionTime = -1;\n }\n\n protected handleTick = (handler: ITickHandler, params?: { once?: boolean }): void => {\n const { once = false } = params ?? {};\n\n // 尝试停止\n if (this.ifCanStop()) {\n this.stop();\n return;\n }\n\n const currentTime = handler.getTime();\n\n // Check if enough time has passed since last execution based on the interval (FPS limit)\n const timeFromLastExecution = this.lastExecutionTime < 0 ? this.interval : currentTime - this.lastExecutionTime;\n\n // Only execute the frame if enough time has passed according to our interval/FPS setting\n if (timeFromLastExecution >= this.interval) {\n this._handlerTick();\n this.lastExecutionTime = currentTime;\n }\n\n if (!once) {\n handler.tick(this.interval, this.handleTick);\n }\n };\n\n protected _handlerTick = (): void => {\n // Specific execution function\n const tickerHandler = this.tickerHandler;\n const time = tickerHandler.getTime();\n\n // Time passed since last frame\n let delta = 0;\n if (this.lastFrameTime >= 0) {\n delta = time - this.lastFrameTime;\n }\n this.lastFrameTime = time;\n\n if (this.status !== STATUS.RUNNING) {\n return;\n }\n\n this.tickCounts++;\n\n // Update all graph managers\n this.timelines.forEach(timeline => {\n timeline.tick(delta);\n });\n\n this.emit('tick', delta);\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/ticker/default-ticker.ts"],"names":[],"mappings":"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","file":"default-ticker.js","sourcesContent":["import { EventEmitter } from '@visactor/vutils';\nimport type { IStage } from '@visactor/vrender-core';\nimport { application, PerformanceRAF } from '@visactor/vrender-core';\nimport { type ITickHandler, type ITicker, STATUS } from '../intreface/ticker';\nimport type { ITimeline } from '../intreface/timeline';\n\nconst performanceRAF = new PerformanceRAF();\n\nclass RAFTickHandler implements ITickHandler {\n protected released: boolean = false;\n\n tick(interval: number, cb: (handler: ITickHandler) => void | boolean): void {\n performanceRAF.addAnimationFrameCb(() => {\n if (this.released) {\n return;\n }\n return cb(this);\n });\n }\n\n release(): void {\n this.released = true;\n }\n\n getTime(): number {\n return Date.now();\n }\n}\n\n/**\n * Graph-based Ticker implementation\n * This ticker works directly with GraphManager instances without needing timeline adapters\n */\nexport class DefaultTicker extends EventEmitter implements ITicker {\n protected interval: number;\n protected tickerHandler: ITickHandler;\n protected status: STATUS;\n protected lastFrameTime: number;\n protected tickCounts: number;\n protected stage: IStage;\n timelines: ITimeline[] = [];\n autoStop: boolean;\n // 随机扰动(每次都对interval进行随机的扰动,避免所有tick都发生在同一帧)\n protected _jitter: number;\n protected timeOffset: number;\n declare _lastTickTime: number;\n protected frameTimeHistory: number[] = [];\n\n constructor(stage: IStage) {\n super();\n this.init();\n this.lastFrameTime = -1;\n this.tickCounts = 0;\n this.stage = stage;\n this.autoStop = true;\n this.interval = 16;\n this.computeTimeOffsetAndJitter();\n }\n\n /**\n * 计算时间偏移和随机扰动\n */\n computeTimeOffsetAndJitter(): void {\n this.timeOffset = Math.floor(Math.random() * this.interval);\n this._jitter = Math.min(Math.max(this.interval * 0.2, 6), this.interval * 0.7);\n }\n\n init(): void {\n this.interval = 16;\n this.status = STATUS.INITIAL;\n application.global.hooks.onSetEnv.tap('graph-ticker', () => {\n this.initHandler();\n });\n if (application.global.env) {\n this.initHandler();\n }\n }\n\n addTimeline(timeline: ITimeline): void {\n this.timelines.push(timeline);\n }\n\n remTimeline(timeline: ITimeline): void {\n this.timelines = this.timelines.filter(t => t !== timeline);\n }\n\n getTimelines(): ITimeline[] {\n return this.timelines;\n }\n\n protected initHandler() {\n this.setupTickHandler();\n }\n\n /**\n * Set up the tick handler\n * @returns true if setup was successful, false otherwise\n */\n protected setupTickHandler(): boolean {\n const handler: ITickHandler = new RAFTickHandler();\n\n // Destroy the previous tick handler\n if (this.tickerHandler) {\n this.tickerHandler.release();\n }\n\n this.tickerHandler = handler;\n return true;\n }\n\n setInterval(interval: number): void {\n this.interval = interval;\n this.computeTimeOffsetAndJitter();\n }\n\n getInterval(): number {\n return this.interval;\n }\n\n setFPS(fps: number): void {\n this.setInterval(Math.floor(1000 / fps));\n }\n\n getFPS(): number {\n return 1000 / this.interval;\n }\n\n tick(interval: number): void {\n this.tickerHandler.tick(interval, (handler: ITickHandler) => {\n return this.handleTick(handler, { once: true });\n });\n }\n\n tickTo(t: number): void {\n if (!this.tickerHandler.tickTo) {\n return;\n }\n this.tickerHandler.tickTo(t, (handler: ITickHandler) => {\n this.handleTick(handler, { once: true });\n });\n }\n\n pause(): boolean {\n if (this.status === STATUS.INITIAL) {\n return false;\n }\n this.status = STATUS.PAUSE;\n return true;\n }\n\n resume(): boolean {\n if (this.status === STATUS.INITIAL) {\n return false;\n }\n this.status = STATUS.RUNNING;\n return true;\n }\n\n ifCanStop(): boolean {\n if (this.autoStop) {\n if (!this.timelines.length) {\n return true;\n }\n if (this.timelines.every(timeline => !timeline.isRunning())) {\n return true;\n }\n }\n return false;\n }\n\n start(force: boolean = false): boolean {\n if (this.status === STATUS.RUNNING) {\n return false;\n }\n if (!this.tickerHandler) {\n return false;\n }\n\n // 暂停中、或者应该停止的时候,就不执行\n if (!force) {\n if (this.status === STATUS.PAUSE) {\n return false;\n }\n if (this.ifCanStop()) {\n return false;\n }\n }\n\n this.status = STATUS.RUNNING;\n this.tickerHandler.tick(0, this.handleTick);\n return true;\n }\n\n stop(): void {\n // Reset the tick handler\n this.status = STATUS.INITIAL;\n this.setupTickHandler();\n this.lastFrameTime = -1;\n }\n\n /**\n * 用于自动启动或停止\n * 基于当前的graph managers检查是否需要启动或停止\n */\n trySyncTickStatus(): void {\n if (this.status === STATUS.INITIAL && this.timelines.some(timeline => timeline.isRunning())) {\n this.start();\n } else if (this.status === STATUS.RUNNING && this.timelines.every(timeline => !timeline.isRunning())) {\n this.stop();\n }\n }\n\n release(): void {\n this.stop();\n this.timelines = [];\n this.tickerHandler?.release();\n this.tickerHandler = null;\n this.lastFrameTime = -1;\n }\n\n protected checkSkip = (delta: number): boolean => {\n // 随机扰动(每次都对interval进行随机的扰动,避免所有tick都发生在同一帧)\n const skip = delta < this.interval + (Math.random() - 0.5) * 2 * this._jitter;\n return skip;\n };\n\n protected handleTick = (handler: ITickHandler, params?: { once?: boolean }): boolean => {\n const { once = false } = params ?? {};\n\n // 尝试停止\n if (this.ifCanStop()) {\n this.stop();\n return false;\n }\n\n const currentTime = handler.getTime();\n this._lastTickTime = currentTime;\n\n if (this.lastFrameTime < 0) {\n this.lastFrameTime = currentTime - this.interval + this.timeOffset;\n this.frameTimeHistory.push(this.lastFrameTime);\n }\n\n const delta = currentTime - this.lastFrameTime;\n\n const skip = this.checkSkip(delta);\n\n if (!skip) {\n this._handlerTick(delta);\n this.lastFrameTime = currentTime;\n this.frameTimeHistory.push(this.lastFrameTime);\n }\n\n if (!once) {\n handler.tick(this.interval, this.handleTick);\n }\n\n return !skip;\n };\n\n protected _handlerTick = (delta: number): void => {\n if (this.status !== STATUS.RUNNING) {\n return;\n }\n\n this.tickCounts++;\n\n // Update all graph managers\n this.timelines.forEach(timeline => {\n timeline.tick(delta);\n });\n\n this.emit('tick', delta);\n };\n}\n"]}
@@ -4,5 +4,4 @@ export function generatorPathEasingFunc(path) {
4
4
  const customPath = new CustomPath2D;
5
5
  return customPath.setCtx(new CurveContext(customPath)), customPath.fromString(path, 0, 0, 1, 1),
6
6
  x => customPath.getYAt(x);
7
- }
8
- //# sourceMappingURL=easing-func.js.map
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vrender-animate",
3
- "version": "0.23.0-alpha.2",
3
+ "version": "0.23.0-alpha.3",
4
4
  "description": "",
5
5
  "sideEffects": false,
6
6
  "main": "cjs/index.js",
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "dependencies": {
15
15
  "@visactor/vutils": "~0.19.4",
16
- "@visactor/vrender-core": "0.23.0-alpha.2"
16
+ "@visactor/vrender-core": "0.23.0-alpha.3"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@rushstack/eslint-patch": "~1.1.4",