@visactor/vrender-animate 1.0.0-alpha.2 → 1.0.0-alpha.21
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.
- package/cjs/animate-extension.d.ts +3 -2
- package/cjs/animate-extension.js +5 -2
- package/cjs/animate-extension.js.map +1 -1
- package/cjs/animate.d.ts +1 -0
- package/cjs/animate.js +8 -5
- package/cjs/animate.js.map +1 -1
- package/cjs/config/morphing.d.ts +2 -0
- package/cjs/config/morphing.js +9 -0
- package/cjs/config/morphing.js.map +1 -0
- package/cjs/custom/clip-graphic.js +1 -1
- package/cjs/custom/clip-graphic.js.map +1 -1
- package/cjs/custom/clip.d.ts +1 -0
- package/cjs/custom/clip.js +9 -1
- package/cjs/custom/clip.js.map +1 -1
- package/cjs/custom/common.d.ts +0 -1
- package/cjs/custom/common.js +6 -9
- package/cjs/custom/common.js.map +1 -1
- package/cjs/custom/fade.js +7 -2
- package/cjs/custom/fade.js.map +1 -1
- package/cjs/custom/{from-to.js → fromTo.js} +6 -9
- package/cjs/custom/fromTo.js.map +1 -0
- package/cjs/custom/{group-fade.js → groupFade.js} +4 -3
- package/cjs/custom/groupFade.js.map +1 -0
- package/cjs/custom/growAngle.js +3 -2
- package/cjs/custom/growAngle.js.map +1 -1
- package/cjs/custom/growCenter.js +1 -1
- package/cjs/custom/growCenter.js.map +1 -1
- package/cjs/custom/growHeight.js +5 -5
- package/cjs/custom/growHeight.js.map +1 -1
- package/cjs/custom/growPoints.js +22 -21
- package/cjs/custom/growPoints.js.map +1 -1
- package/cjs/custom/growRadius.js +1 -1
- package/cjs/custom/growRadius.js.map +1 -1
- package/cjs/custom/growWidth.js +1 -1
- package/cjs/custom/growWidth.js.map +1 -1
- package/cjs/custom/morphing.d.ts +51 -0
- package/cjs/custom/morphing.js +298 -0
- package/cjs/custom/morphing.js.map +1 -0
- package/cjs/custom/motionPath.d.ts +21 -0
- package/cjs/custom/motionPath.js +31 -0
- package/cjs/custom/motionPath.js.map +1 -0
- package/cjs/custom/move.d.ts +4 -0
- package/cjs/custom/move.js +11 -11
- package/cjs/custom/move.js.map +1 -1
- package/cjs/custom/register.d.ts +27 -0
- package/cjs/custom/register.js +394 -4
- package/cjs/custom/register.js.map +1 -1
- package/cjs/custom/richtext/input-richtext.d.ts +4 -2
- package/cjs/custom/richtext/input-richtext.js +20 -10
- package/cjs/custom/richtext/input-richtext.js.map +1 -1
- package/cjs/custom/richtext/slide-richtext.js +1 -1
- package/cjs/custom/rotate.js +2 -1
- package/cjs/custom/rotate.js.map +1 -1
- package/cjs/custom/scale.js +7 -7
- package/cjs/custom/scale.js.map +1 -1
- package/cjs/custom/story.d.ts +68 -0
- package/cjs/custom/story.js +149 -3
- package/cjs/custom/story.js.map +1 -1
- package/cjs/custom/streamLight.d.ts +27 -0
- package/cjs/custom/streamLight.js +161 -0
- package/cjs/custom/streamLight.js.map +1 -0
- package/cjs/custom/tag-points.js +4 -1
- package/cjs/custom/tag-points.js.map +1 -1
- package/cjs/custom/update.js +2 -3
- package/cjs/custom/update.js.map +1 -1
- package/cjs/executor/animate-executor.d.ts +1 -1
- package/cjs/executor/animate-executor.js +69 -63
- package/cjs/executor/animate-executor.js.map +1 -1
- package/cjs/index.d.ts +3 -2
- package/cjs/index.js +34 -14
- package/cjs/index.js.map +1 -1
- package/cjs/state/animation-states-registry.js +18 -0
- package/cjs/state/animation-states-registry.js.map +1 -1
- package/cjs/step.d.ts +2 -0
- package/cjs/step.js +10 -2
- package/cjs/step.js.map +1 -1
- package/cjs/ticker/default-ticker.d.ts +3 -2
- package/cjs/ticker/default-ticker.js +9 -6
- package/cjs/ticker/default-ticker.js.map +1 -1
- package/cjs/ticker/manual-ticker.d.ts +6 -1
- package/cjs/ticker/manual-ticker.js +26 -4
- package/cjs/ticker/manual-ticker.js.map +1 -1
- package/cjs/timeline.d.ts +13 -5
- package/cjs/timeline.js +31 -18
- package/cjs/timeline.js.map +1 -1
- package/cjs/utils/transform.d.ts +2 -0
- package/cjs/utils/transform.js +10 -0
- package/cjs/utils/transform.js.map +1 -0
- package/dist/index.es.js +1374 -186
- package/es/animate-extension.d.ts +3 -2
- package/es/animate-extension.js +5 -2
- package/es/animate-extension.js.map +1 -1
- package/es/animate.d.ts +1 -0
- package/es/animate.js +8 -5
- package/es/animate.js.map +1 -1
- package/es/config/morphing.d.ts +2 -0
- package/es/config/morphing.js +5 -0
- package/es/config/morphing.js.map +1 -0
- package/es/custom/clip-graphic.js +1 -1
- package/es/custom/clip-graphic.js.map +1 -1
- package/es/custom/clip.d.ts +1 -0
- package/es/custom/clip.js +9 -1
- package/es/custom/clip.js.map +1 -1
- package/es/custom/common.d.ts +0 -1
- package/es/custom/common.js +6 -9
- package/es/custom/common.js.map +1 -1
- package/es/custom/fade.js +7 -2
- package/es/custom/fade.js.map +1 -1
- package/es/custom/{from-to.js → fromTo.js} +6 -9
- package/es/custom/fromTo.js.map +1 -0
- package/es/custom/{group-fade.js → groupFade.js} +4 -3
- package/es/custom/groupFade.js.map +1 -0
- package/es/custom/growAngle.js +3 -2
- package/es/custom/growAngle.js.map +1 -1
- package/es/custom/growCenter.js +1 -1
- package/es/custom/growCenter.js.map +1 -1
- package/es/custom/growHeight.js +5 -5
- package/es/custom/growHeight.js.map +1 -1
- package/es/custom/growPoints.js +22 -21
- package/es/custom/growPoints.js.map +1 -1
- package/es/custom/growRadius.js +1 -1
- package/es/custom/growRadius.js.map +1 -1
- package/es/custom/growWidth.js +1 -1
- package/es/custom/growWidth.js.map +1 -1
- package/es/custom/morphing.d.ts +51 -0
- package/es/custom/morphing.js +289 -0
- package/es/custom/morphing.js.map +1 -0
- package/es/custom/motionPath.d.ts +21 -0
- package/es/custom/motionPath.js +23 -0
- package/es/custom/motionPath.js.map +1 -0
- package/es/custom/move.d.ts +4 -0
- package/es/custom/move.js +10 -10
- package/es/custom/move.js.map +1 -1
- package/es/custom/register.d.ts +27 -0
- package/es/custom/register.js +15 -5
- package/es/custom/register.js.map +1 -1
- package/es/custom/richtext/input-richtext.d.ts +4 -2
- package/es/custom/richtext/input-richtext.js +20 -10
- package/es/custom/richtext/input-richtext.js.map +1 -1
- package/es/custom/richtext/slide-richtext.js +1 -1
- package/es/custom/rotate.js +2 -1
- package/es/custom/rotate.js.map +1 -1
- package/es/custom/scale.js +7 -7
- package/es/custom/scale.js.map +1 -1
- package/es/custom/story.d.ts +68 -0
- package/es/custom/story.js +142 -1
- package/es/custom/story.js.map +1 -1
- package/es/custom/streamLight.d.ts +27 -0
- package/es/custom/streamLight.js +157 -0
- package/es/custom/streamLight.js.map +1 -0
- package/es/custom/tag-points.js +4 -1
- package/es/custom/tag-points.js.map +1 -1
- package/es/custom/update.js +2 -3
- package/es/custom/update.js.map +1 -1
- package/es/executor/animate-executor.d.ts +1 -1
- package/es/executor/animate-executor.js +68 -61
- package/es/executor/animate-executor.js.map +1 -1
- package/es/index.d.ts +3 -2
- package/es/index.js +4 -2
- package/es/index.js.map +1 -1
- package/es/state/animation-states-registry.js +18 -0
- package/es/state/animation-states-registry.js.map +1 -1
- package/es/step.d.ts +2 -0
- package/es/step.js +10 -2
- package/es/step.js.map +1 -1
- package/es/ticker/default-ticker.d.ts +3 -2
- package/es/ticker/default-ticker.js +9 -6
- package/es/ticker/default-ticker.js.map +1 -1
- package/es/ticker/manual-ticker.d.ts +6 -1
- package/es/ticker/manual-ticker.js +27 -3
- package/es/ticker/manual-ticker.js.map +1 -1
- package/es/timeline.d.ts +13 -5
- package/es/timeline.js +32 -17
- package/es/timeline.js.map +1 -1
- package/es/utils/transform.d.ts +2 -0
- package/es/utils/transform.js +4 -0
- package/es/utils/transform.js.map +1 -0
- package/package.json +5 -5
- package/cjs/custom/from-to.js.map +0 -1
- package/cjs/custom/group-fade.js.map +0 -1
- package/es/custom/from-to.js.map +0 -1
- package/es/custom/group-fade.js.map +0 -1
- /package/cjs/custom/{from-to.d.ts → fromTo.d.ts} +0 -0
- /package/cjs/custom/{group-fade.d.ts → groupFade.d.ts} +0 -0
- /package/es/custom/{from-to.d.ts → fromTo.d.ts} +0 -0
- /package/es/custom/{group-fade.d.ts → groupFade.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/state/animation-states-registry.ts"],"names":[],"mappings":"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","file":"animation-states-registry.js","sourcesContent":["import type { IGraphic } from '@visactor/vrender-core';\n\ninterface ITransitionResult {\n allowTransition: boolean;\n stopOriginalTransition: boolean;\n}\n\n/**\n * 注册动画状态切换的转换函数\n */\nexport type TransitionFunction = (graphic: IGraphic, fromState: string) => ITransitionResult;\n\n/**\n * 动画状态切换的注册表\n * 管理所有图形的动画状态切换逻辑\n */\nexport class AnimationTransitionRegistry {\n private static instance: AnimationTransitionRegistry;\n\n // 源状态到目标状态的映射,每个目标状态都有一个转换函数\n private transitions: Map<string, Map<string, TransitionFunction>> = new Map();\n\n constructor() {\n this.registerDefaultTransitions();\n }\n\n /**\n * 获取注册表的单例实例\n */\n static getInstance(): AnimationTransitionRegistry {\n if (!AnimationTransitionRegistry.instance) {\n AnimationTransitionRegistry.instance = new AnimationTransitionRegistry();\n }\n return AnimationTransitionRegistry.instance;\n }\n\n /**\n * 注册默认的转换规则\n */\n private registerDefaultTransitions(): void {\n // appear动画,可以被任何动画覆盖,但不会停止(disappear、exit除外)\n this.registerTransition('appear', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // appear 动画碰到appear动画,什么都不会发生\n this.registerTransition('appear', 'appear', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('appear', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n this.registerTransition('appear', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n // 循环动画(normal),可以被任何动画覆盖,但不会停止(disappear、exit除外)\n this.registerTransition('normal', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // 循环动画碰到循环动画,什么都不会发生\n this.registerTransition('normal', 'normal', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('normal', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n this.registerTransition('normal', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n // 退出动画不能被覆盖或停止(disappear除外)\n this.registerTransition('exit', '*', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('exit', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n // 退出动画碰到enter动画,会立即停止\n this.registerTransition('exit', 'enter', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n // 退出动画碰到退出,什么都不会发生\n this.registerTransition('exit', 'exit', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n\n // enter 动画可以被任何动画覆盖,但不会停止(exit、disappear除外)\n this.registerTransition('enter', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // enter 动画碰到enter动画,什么都不会发生\n this.registerTransition('enter', 'enter', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('enter', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n this.registerTransition('enter', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n // disappear 动画碰到任何动画,什么都不会发生(appear除外)\n this.registerTransition('disappear', '*', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n\n // disappear 动画碰到appear动画,会立即停止\n this.registerTransition('disappear', 'appear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n }\n\n /**\n * 检查两个状态之间是否允许转换\n */\n isTransitionAllowed(fromState: string, toState: string, graphic: IGraphic): ITransitionResult {\n // 直接转换规则\n let func = this.transitions.get(fromState)?.get(toState);\n if (func) {\n return func(graphic, fromState);\n }\n\n // 状态到通配符\n func = this.transitions.get(fromState)?.get('*');\n if (func) {\n return func(graphic, fromState);\n }\n\n // 通配符到状态\n func = this.transitions.get('*')?.get(toState);\n if (func) {\n return func(graphic, fromState);\n }\n\n // 通配符到通配符\n func = this.transitions.get('*')?.get('*');\n if (func) {\n return func(graphic, fromState);\n }\n\n // 默认允许转换\n return {\n allowTransition: true,\n stopOriginalTransition: true\n };\n }\n\n /**\n * 注册两个状态之间的转换\n */\n registerTransition(fromState: string, toState: string, transition: TransitionFunction): void {\n let fromStateMap = this.transitions.get(fromState);\n\n if (!fromStateMap) {\n fromStateMap = new Map();\n this.transitions.set(fromState, fromStateMap);\n }\n\n fromStateMap.set(toState, transition);\n }\n}\n\n// 初始化单例转换注册表\nconst transitionRegistry = AnimationTransitionRegistry.getInstance();\n\nexport { transitionRegistry };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/state/animation-states-registry.ts"],"names":[],"mappings":"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","file":"animation-states-registry.js","sourcesContent":["import type { IGraphic } from '@visactor/vrender-core';\n\ninterface ITransitionResult {\n allowTransition: boolean;\n stopOriginalTransition: boolean;\n}\n\n/**\n * 注册动画状态切换的转换函数\n */\nexport type TransitionFunction = (graphic: IGraphic, fromState: string) => ITransitionResult;\n\n/**\n * 动画状态切换的注册表\n * 管理所有图形的动画状态切换逻辑\n */\nexport class AnimationTransitionRegistry {\n private static instance: AnimationTransitionRegistry;\n\n // 源状态到目标状态的映射,每个目标状态都有一个转换函数\n private transitions: Map<string, Map<string, TransitionFunction>> = new Map();\n\n constructor() {\n this.registerDefaultTransitions();\n }\n\n /**\n * 获取注册表的单例实例\n */\n static getInstance(): AnimationTransitionRegistry {\n if (!AnimationTransitionRegistry.instance) {\n AnimationTransitionRegistry.instance = new AnimationTransitionRegistry();\n }\n return AnimationTransitionRegistry.instance;\n }\n\n /**\n * 注册默认的转换规则\n */\n private registerDefaultTransitions(): void {\n // appear动画,可以被任何动画覆盖,但不会停止(disappear、exit除外)\n this.registerTransition('appear', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // appear 动画碰到appear动画,什么都不会发生\n this.registerTransition('appear', 'appear', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('appear', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n this.registerTransition('appear', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n // 循环动画(normal),可以被任何动画覆盖,但不会停止(disappear、exit除外)\n this.registerTransition('normal', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // 循环动画碰到循环动画,什么都不会发生\n this.registerTransition('normal', 'normal', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('normal', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n this.registerTransition('normal', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n // 退出动画不能被覆盖或停止(disappear除外)\n this.registerTransition('exit', '*', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('exit', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n // 退出动画碰到enter动画,会立即停止\n this.registerTransition('exit', 'enter', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n // 退出动画碰到退出,什么都不会发生\n this.registerTransition('exit', 'exit', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n\n // enter 动画可以被任何动画覆盖,但不会停止(exit、disappear除外)\n this.registerTransition('enter', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // enter 动画碰到enter动画,什么都不会发生\n this.registerTransition('enter', 'enter', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n this.registerTransition('enter', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n this.registerTransition('enter', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n // disappear 动画碰到任何动画,什么都不会发生(appear除外)\n this.registerTransition('disappear', '*', () => ({\n allowTransition: false,\n stopOriginalTransition: false\n }));\n\n // disappear 动画碰到appear动画,会立即停止\n this.registerTransition('disappear', 'appear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n this.registerTransition('update', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // update动画碰到disappear动画,会停止,也会被覆盖\n this.registerTransition('update', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n // update动画碰到exit动画,会停止,也会被覆盖\n this.registerTransition('update', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n\n // state动画,可以被任何动画覆盖,但不会停止(disappear、exit除外)\n this.registerTransition('state', '*', () => ({\n allowTransition: true,\n stopOriginalTransition: false\n }));\n // state动画碰到disappear动画,会停止,也会被覆盖\n this.registerTransition('state', 'disappear', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n // state动画碰到exit动画,会停止,也会被覆盖\n this.registerTransition('state', 'exit', () => ({\n allowTransition: true,\n stopOriginalTransition: true\n }));\n }\n\n /**\n * 检查两个状态之间是否允许转换\n */\n isTransitionAllowed(fromState: string, toState: string, graphic: IGraphic): ITransitionResult {\n // 直接转换规则\n let func = this.transitions.get(fromState)?.get(toState);\n if (func) {\n return func(graphic, fromState);\n }\n\n // 状态到通配符\n func = this.transitions.get(fromState)?.get('*');\n if (func) {\n return func(graphic, fromState);\n }\n\n // 通配符到状态\n func = this.transitions.get('*')?.get(toState);\n if (func) {\n return func(graphic, fromState);\n }\n\n // 通配符到通配符\n func = this.transitions.get('*')?.get('*');\n if (func) {\n return func(graphic, fromState);\n }\n\n // 默认允许转换\n return {\n allowTransition: true,\n stopOriginalTransition: true\n };\n }\n\n /**\n * 注册两个状态之间的转换\n */\n registerTransition(fromState: string, toState: string, transition: TransitionFunction): void {\n let fromStateMap = this.transitions.get(fromState);\n\n if (!fromStateMap) {\n fromStateMap = new Map();\n this.transitions.set(fromState, fromStateMap);\n }\n\n fromStateMap.set(toState, transition);\n }\n}\n\n// 初始化单例转换注册表\nconst transitionRegistry = AnimationTransitionRegistry.getInstance();\n\nexport { transitionRegistry };\n"]}
|
package/cjs/step.d.ts
CHANGED
|
@@ -45,6 +45,8 @@ export declare class Step implements IStep {
|
|
|
45
45
|
}
|
|
46
46
|
export declare class WaitStep extends Step {
|
|
47
47
|
constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType);
|
|
48
|
+
onStart(): void;
|
|
49
|
+
onFirstRun(): void;
|
|
48
50
|
update(end: boolean, ratio: number, out: Record<string, any>): void;
|
|
49
51
|
determineInterpolateUpdateFunction(): void;
|
|
50
52
|
}
|
package/cjs/step.js
CHANGED
|
@@ -10,9 +10,10 @@ function noop() {}
|
|
|
10
10
|
|
|
11
11
|
class Step {
|
|
12
12
|
constructor(type, props, duration, easing) {
|
|
13
|
+
var _a;
|
|
13
14
|
this._startTime = 0, this._hasFirstRun = !1, this._syncAttributeUpdate = () => {
|
|
14
15
|
this.target.setAttributes(this.target.attribute);
|
|
15
|
-
}, this.type = type, this.props = props, this.duration = duration, this.easing = easing ? "function" == typeof easing ? easing : easing_1.Easing[easing] : easing_1.Easing.linear,
|
|
16
|
+
}, this.type = type, this.props = props, this.duration = duration, this.easing = easing ? "function" == typeof easing ? easing : null !== (_a = easing_1.Easing[easing]) && void 0 !== _a ? _a : easing_1.Easing.linear : easing_1.Easing.linear,
|
|
16
17
|
"wait" === type && (this.onUpdate = noop), this.id = vrender_core_1.Generator.GenAutoIncrementId(),
|
|
17
18
|
this.syncAttributeUpdate = noop;
|
|
18
19
|
}
|
|
@@ -75,7 +76,7 @@ class Step {
|
|
|
75
76
|
tryPreventConflict() {
|
|
76
77
|
const animate = this.animate;
|
|
77
78
|
this.target.animates.forEach((a => {
|
|
78
|
-
if (a === animate || a.priority > animate.priority) return;
|
|
79
|
+
if (a === animate || a.priority > animate.priority || a.priority === 1 / 0) return;
|
|
79
80
|
const fromProps = a.getStartProps();
|
|
80
81
|
this.propKeys.forEach((key => {
|
|
81
82
|
null != fromProps[key] && a.preventAttr(key);
|
|
@@ -124,6 +125,13 @@ class WaitStep extends Step {
|
|
|
124
125
|
constructor(type, props, duration, easing) {
|
|
125
126
|
super(type, props, duration, easing);
|
|
126
127
|
}
|
|
128
|
+
onStart() {
|
|
129
|
+
super.onStart();
|
|
130
|
+
}
|
|
131
|
+
onFirstRun() {
|
|
132
|
+
const fromProps = this.getFromProps();
|
|
133
|
+
this.target.setAttributes(fromProps);
|
|
134
|
+
}
|
|
127
135
|
update(end, ratio, out) {
|
|
128
136
|
this.onStart();
|
|
129
137
|
}
|
package/cjs/step.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import {\n ColorStore,\n ColorType,\n Generator,\n type IGraphic,\n type IAnimate,\n type IStep,\n type EasingType,\n type EasingTypeFunc,\n type IAnimateStepType\n} from '@visactor/vrender-core';\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 id: number;\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 syncAttributeUpdate: () => 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 this.id = Generator.GenAutoIncrementId();\n this.syncAttributeUpdate = noop;\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n this.syncAttributeUpdate();\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 if (this.target.type === 'glyph') {\n this.syncAttributeUpdate = this._syncAttributeUpdate;\n }\n }\n\n _syncAttributeUpdate = (): void => {\n this.target.setAttributes(this.target.attribute);\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 this.syncAttributeUpdate();\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import {\n ColorStore,\n ColorType,\n Generator,\n type IGraphic,\n type IAnimate,\n type IStep,\n type EasingType,\n type EasingTypeFunc,\n type IAnimateStepType\n} from '@visactor/vrender-core';\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 id: number;\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 syncAttributeUpdate: () => 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] ?? Easing.linear;\n } else {\n this.easing = Easing.linear;\n }\n if (type === 'wait') {\n this.onUpdate = noop;\n }\n this.id = Generator.GenAutoIncrementId();\n this.syncAttributeUpdate = noop;\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n this.syncAttributeUpdate();\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 if (this.target.type === 'glyph') {\n this.syncAttributeUpdate = this._syncAttributeUpdate;\n }\n }\n\n _syncAttributeUpdate = (): void => {\n this.target.setAttributes(this.target.attribute);\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 || a.priority === Infinity) {\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 this.syncAttributeUpdate();\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 onStart(): void {\n super.onStart();\n }\n onFirstRun(): void {\n // 设置上一个阶段的props到attribute\n const fromProps = this.getFromProps();\n this.target.setAttributes(fromProps);\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"]}
|
|
@@ -14,7 +14,8 @@ export declare class DefaultTicker extends EventEmitter implements ITicker {
|
|
|
14
14
|
protected timeOffset: number;
|
|
15
15
|
_lastTickTime: number;
|
|
16
16
|
protected frameTimeHistory: number[];
|
|
17
|
-
constructor(stage
|
|
17
|
+
constructor(stage?: IStage);
|
|
18
|
+
bindStage(stage: IStage): void;
|
|
18
19
|
computeTimeOffsetAndJitter(): void;
|
|
19
20
|
init(): void;
|
|
20
21
|
addTimeline(timeline: ITimeline): void;
|
|
@@ -35,7 +36,7 @@ export declare class DefaultTicker extends EventEmitter implements ITicker {
|
|
|
35
36
|
stop(): void;
|
|
36
37
|
trySyncTickStatus(): void;
|
|
37
38
|
release(): void;
|
|
38
|
-
protected checkSkip
|
|
39
|
+
protected checkSkip(delta: number): boolean;
|
|
39
40
|
protected handleTick: (handler: ITickHandler, params?: {
|
|
40
41
|
once?: boolean;
|
|
41
42
|
}) => boolean;
|
|
@@ -25,10 +25,7 @@ class RAFTickHandler {
|
|
|
25
25
|
|
|
26
26
|
class DefaultTicker extends vutils_1.EventEmitter {
|
|
27
27
|
constructor(stage) {
|
|
28
|
-
super(), this.timelines = [], this.frameTimeHistory = [], this.
|
|
29
|
-
if ("performance" === this.stage.params.optimize.tickRenderMode) return !1;
|
|
30
|
-
return delta < this.interval + 2 * (Math.random() - .5) * this._jitter;
|
|
31
|
-
}, this.handleTick = (handler, params) => {
|
|
28
|
+
super(), this.timelines = [], this.frameTimeHistory = [], this.handleTick = (handler, params) => {
|
|
32
29
|
const {once: once = !1} = null != params ? params : {};
|
|
33
30
|
if (this.ifCanStop()) return this.stop(), !1;
|
|
34
31
|
const currentTime = handler.getTime();
|
|
@@ -44,6 +41,9 @@ class DefaultTicker extends vutils_1.EventEmitter {
|
|
|
44
41
|
}, this.init(), this.lastFrameTime = -1, this.tickCounts = 0, this.stage = stage,
|
|
45
42
|
this.autoStop = !0, this.interval = 16, this.computeTimeOffsetAndJitter();
|
|
46
43
|
}
|
|
44
|
+
bindStage(stage) {
|
|
45
|
+
this.stage = stage;
|
|
46
|
+
}
|
|
47
47
|
computeTimeOffsetAndJitter() {
|
|
48
48
|
this.timeOffset = Math.floor(Math.random() * this.interval), this._jitter = Math.min(Math.max(.2 * this.interval, 6), .7 * this.interval);
|
|
49
49
|
}
|
|
@@ -129,7 +129,10 @@ class DefaultTicker extends vutils_1.EventEmitter {
|
|
|
129
129
|
this.stop(), this.timelines = [], null === (_a = this.tickerHandler) || void 0 === _a || _a.release(),
|
|
130
130
|
this.tickerHandler = null, this.lastFrameTime = -1;
|
|
131
131
|
}
|
|
132
|
+
checkSkip(delta) {
|
|
133
|
+
if ("performance" === this.stage.params.optimize.tickRenderMode) return !1;
|
|
134
|
+
return delta < this.interval + 2 * (Math.random() - .5) * this._jitter;
|
|
135
|
+
}
|
|
132
136
|
}
|
|
133
137
|
|
|
134
|
-
exports.DefaultTicker = DefaultTicker;
|
|
135
|
-
//# sourceMappingURL=default-ticker.js.map
|
|
138
|
+
exports.DefaultTicker = DefaultTicker;
|
|
@@ -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, ITimeline } from '@visactor/vrender-core';\nimport { application, PerformanceRAF, type ITickHandler, type ITicker, STATUS } from '@visactor/vrender-core';\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 if (this.stage.params.optimize.tickRenderMode === 'performance') {\n return false;\n }\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"]}
|
|
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, ITimeline } from '@visactor/vrender-core';\nimport { application, PerformanceRAF, type ITickHandler, type ITicker, STATUS } from '@visactor/vrender-core';\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 bindStage(stage: IStage): void {\n this.stage = stage;\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 if (this.stage.params.optimize.tickRenderMode === 'performance') {\n return false;\n }\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"]}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { IStage } from '@visactor/vrender-core';
|
|
2
|
+
import { type ITicker } from '@visactor/vrender-core';
|
|
2
3
|
import { DefaultTicker } from './default-ticker';
|
|
3
4
|
export declare class ManualTicker extends DefaultTicker implements ITicker {
|
|
5
|
+
constructor(stage?: IStage);
|
|
4
6
|
protected setupTickHandler(): boolean;
|
|
7
|
+
checkSkip(delta: number): boolean;
|
|
5
8
|
getTime(): number;
|
|
9
|
+
tickAt(time: number): void;
|
|
10
|
+
start(force?: boolean): boolean;
|
|
6
11
|
}
|
|
@@ -4,15 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: !0
|
|
5
5
|
}), exports.ManualTicker = void 0;
|
|
6
6
|
|
|
7
|
-
const default_ticker_1 = require("./default-ticker");
|
|
7
|
+
const vrender_core_1 = require("@visactor/vrender-core"), default_ticker_1 = require("./default-ticker");
|
|
8
8
|
|
|
9
9
|
class ManualTickHandler {
|
|
10
10
|
constructor() {
|
|
11
|
-
this.released = !1, this.
|
|
11
|
+
this.released = !1, this.currentTime = -1;
|
|
12
12
|
}
|
|
13
13
|
tick(interval, cb) {
|
|
14
|
-
this.
|
|
15
|
-
cb(this);
|
|
14
|
+
this.currentTime < 0 && (this.currentTime = 0), this.currentTime += interval, cb(this);
|
|
16
15
|
}
|
|
17
16
|
release() {
|
|
18
17
|
this.released = !0;
|
|
@@ -20,17 +19,40 @@ class ManualTickHandler {
|
|
|
20
19
|
getTime() {
|
|
21
20
|
return this.currentTime;
|
|
22
21
|
}
|
|
22
|
+
tickTo(time, cb) {
|
|
23
|
+
this.currentTime < 0 && (this.currentTime = 0);
|
|
24
|
+
const interval = time - this.currentTime;
|
|
25
|
+
this.tick(interval, cb);
|
|
26
|
+
}
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
class ManualTicker extends default_ticker_1.DefaultTicker {
|
|
30
|
+
constructor(stage) {
|
|
31
|
+
super(stage), this.lastFrameTime = 0, this.status = vrender_core_1.STATUS.RUNNING;
|
|
32
|
+
}
|
|
26
33
|
setupTickHandler() {
|
|
27
34
|
const handler = new ManualTickHandler;
|
|
28
35
|
return this.tickerHandler && this.tickerHandler.release(), this.tickerHandler = handler,
|
|
29
36
|
!0;
|
|
30
37
|
}
|
|
38
|
+
checkSkip(delta) {
|
|
39
|
+
return !1;
|
|
40
|
+
}
|
|
31
41
|
getTime() {
|
|
32
42
|
return this.tickerHandler.getTime();
|
|
33
43
|
}
|
|
44
|
+
tickAt(time) {
|
|
45
|
+
this.tickTo(time);
|
|
46
|
+
}
|
|
47
|
+
start(force = !1) {
|
|
48
|
+
if (this.status === vrender_core_1.STATUS.RUNNING) return !1;
|
|
49
|
+
if (!this.tickerHandler) return !1;
|
|
50
|
+
if (!force) {
|
|
51
|
+
if (this.status === vrender_core_1.STATUS.PAUSE) return !1;
|
|
52
|
+
if (this.ifCanStop()) return !1;
|
|
53
|
+
}
|
|
54
|
+
return this.status = vrender_core_1.STATUS.RUNNING, !0;
|
|
55
|
+
}
|
|
34
56
|
}
|
|
35
57
|
|
|
36
58
|
exports.ManualTicker = ManualTicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ticker/manual-ticker.ts"],"names":[],"mappings":";;;AACA,qDAAiD;AAEjD,MAAM,iBAAiB;IAAvB;QACY,aAAQ,GAAY,KAAK,CAAC;QAC1B,
|
|
1
|
+
{"version":3,"sources":["../src/ticker/manual-ticker.ts"],"names":[],"mappings":";;;AACA,yDAAiF;AACjF,qDAAiD;AAEjD,MAAM,iBAAiB;IAAvB;QACY,aAAQ,GAAY,KAAK,CAAC;QAC1B,gBAAW,GAAW,CAAC,CAAC,CAAC;IAyBrC,CAAC;IAvBC,IAAI,CAAC,QAAgB,EAAE,EAAmC;QACxD,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACxB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SACtB;QACD,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC;QAC7B,EAAE,CAAC,IAAI,CAAC,CAAC;IACX,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,EAAmC;QACtD,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACxB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SACtB;QACD,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,MAAa,YAAa,SAAQ,8BAAa;IAC7C,YAAY,KAAc;QACxB,KAAK,CAAC,KAAK,CAAC,CAAC;QAGb,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,qBAAM,CAAC,OAAO,CAAC;IAC/B,CAAC;IACS,gBAAgB;QACxB,MAAM,OAAO,GAAiB,IAAI,iBAAiB,EAAE,CAAC;QAGtD,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,KAAK,GAAG,KAAK;QACjB,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAM,CAAC,OAAO,EAAE;YAClC,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAM,CAAC,KAAK,EAAE;gBAChC,OAAO,KAAK,CAAC;aACd;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;gBACpB,OAAO,KAAK,CAAC;aACd;SACF;QACD,IAAI,CAAC,MAAM,GAAG,qBAAM,CAAC,OAAO,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAlDD,oCAkDC","file":"manual-ticker.js","sourcesContent":["import type { IStage } from '@visactor/vrender-core';\nimport { STATUS, type ITickHandler, type ITicker } from '@visactor/vrender-core';\nimport { DefaultTicker } from './default-ticker';\n\nclass ManualTickHandler implements ITickHandler {\n protected released: boolean = false;\n protected currentTime: number = -1;\n\n tick(interval: number, cb: (handler: ITickHandler) => void): void {\n if (this.currentTime < 0) {\n this.currentTime = 0;\n }\n this.currentTime += interval;\n cb(this);\n }\n\n release(): void {\n this.released = true;\n }\n\n getTime(): number {\n return this.currentTime;\n }\n\n tickTo(time: number, cb: (handler: ITickHandler) => void): void {\n if (this.currentTime < 0) {\n this.currentTime = 0;\n }\n const interval = time - this.currentTime;\n this.tick(interval, cb);\n }\n}\n\nexport class ManualTicker extends DefaultTicker implements ITicker {\n constructor(stage?: IStage) {\n super(stage);\n // manualTicker 的 lastFrameTime 默认为 0\n // status 默认为 STATUS.RUNNING(不需要启动)\n this.lastFrameTime = 0;\n this.status = STATUS.RUNNING;\n }\n protected setupTickHandler(): boolean {\n const handler: ITickHandler = new ManualTickHandler();\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 checkSkip(delta: number): boolean {\n return false;\n }\n\n getTime(): number {\n return this.tickerHandler.getTime();\n }\n\n tickAt(time: number): void {\n this.tickTo(time);\n }\n\n start(force = false) {\n if (this.status === STATUS.RUNNING) {\n return false;\n }\n if (!this.tickerHandler) {\n return false;\n }\n if (!force) {\n if (this.status === STATUS.PAUSE) {\n return false;\n }\n if (this.ifCanStop()) {\n return false;\n }\n }\n this.status = STATUS.RUNNING;\n return true;\n }\n}\n"]}
|
package/cjs/timeline.d.ts
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { type IAnimate, type ITimeline } from '@visactor/vrender-core';
|
|
2
|
-
|
|
2
|
+
import { EventEmitter } from '@visactor/vutils';
|
|
3
|
+
interface AnimateNode {
|
|
4
|
+
animate: IAnimate;
|
|
5
|
+
next: AnimateNode | null;
|
|
6
|
+
prev: AnimateNode | null;
|
|
7
|
+
}
|
|
8
|
+
export declare class DefaultTimeline extends EventEmitter implements ITimeline {
|
|
3
9
|
id: number;
|
|
4
|
-
protected
|
|
5
|
-
protected
|
|
10
|
+
protected head: AnimateNode | null;
|
|
11
|
+
protected tail: AnimateNode | null;
|
|
12
|
+
protected animateMap: Map<IAnimate, AnimateNode>;
|
|
13
|
+
protected _animateCount: number;
|
|
6
14
|
protected paused: boolean;
|
|
7
15
|
protected _playSpeed: number;
|
|
8
16
|
protected _totalDuration: number;
|
|
9
17
|
protected _startTime: number;
|
|
10
18
|
protected _currentTime: number;
|
|
11
|
-
protected _endAnimatePtr: number;
|
|
12
19
|
isGlobal?: boolean;
|
|
13
20
|
get animateCount(): number;
|
|
14
21
|
constructor();
|
|
@@ -19,7 +26,7 @@ export declare class DefaultTimeline implements ITimeline {
|
|
|
19
26
|
resume(): void;
|
|
20
27
|
tick(delta: number): void;
|
|
21
28
|
clear(): void;
|
|
22
|
-
removeAnimate(animate: IAnimate, release?: boolean
|
|
29
|
+
removeAnimate(animate: IAnimate, release?: boolean): void;
|
|
23
30
|
protected recalculateTotalDuration(): void;
|
|
24
31
|
getTotalDuration(): number;
|
|
25
32
|
getPlaySpeed(): number;
|
|
@@ -31,3 +38,4 @@ export declare class DefaultTimeline implements ITimeline {
|
|
|
31
38
|
setCurrentTime(time: number): void;
|
|
32
39
|
}
|
|
33
40
|
export declare const defaultTimeline: DefaultTimeline;
|
|
41
|
+
export {};
|
package/cjs/timeline.js
CHANGED
|
@@ -4,26 +4,36 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: !0
|
|
5
5
|
}), exports.defaultTimeline = exports.DefaultTimeline = void 0;
|
|
6
6
|
|
|
7
|
-
const vrender_core_1 = require("@visactor/vrender-core");
|
|
7
|
+
const vrender_core_1 = require("@visactor/vrender-core"), vutils_1 = require("@visactor/vutils");
|
|
8
8
|
|
|
9
|
-
class DefaultTimeline {
|
|
9
|
+
class DefaultTimeline extends vutils_1.EventEmitter {
|
|
10
10
|
get animateCount() {
|
|
11
|
-
return this.
|
|
11
|
+
return this._animateCount;
|
|
12
12
|
}
|
|
13
13
|
constructor() {
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
14
|
+
super(), this.head = null, this.tail = null, this.animateMap = new Map, this._animateCount = 0,
|
|
15
|
+
this._playSpeed = 1, this._totalDuration = 0, this._startTime = 0, this._currentTime = 0,
|
|
16
|
+
this.id = vrender_core_1.Generator.GenAutoIncrementId(), this.paused = !1;
|
|
17
17
|
}
|
|
18
18
|
isRunning() {
|
|
19
|
-
return !this.paused && this.
|
|
19
|
+
return !this.paused && this._animateCount > 0;
|
|
20
20
|
}
|
|
21
21
|
forEachAccessAnimate(cb) {
|
|
22
|
-
|
|
22
|
+
let current = this.head, index = 0;
|
|
23
|
+
for (;current; ) {
|
|
24
|
+
const next = current.next;
|
|
25
|
+
cb(current.animate, index), index++, current = next;
|
|
26
|
+
}
|
|
23
27
|
}
|
|
24
28
|
addAnimate(animate) {
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
const newNode = {
|
|
30
|
+
animate: animate,
|
|
31
|
+
next: null,
|
|
32
|
+
prev: null
|
|
33
|
+
};
|
|
34
|
+
this.head ? this.tail && (this.tail.next = newNode, newNode.prev = this.tail, this.tail = newNode) : (this.head = newNode,
|
|
35
|
+
this.tail = newNode), this.animateMap.set(animate, newNode), this._animateCount++,
|
|
36
|
+
this._totalDuration = Math.max(this._totalDuration, animate.getStartTime() + animate.getDuration());
|
|
27
37
|
}
|
|
28
38
|
pause() {
|
|
29
39
|
this.paused = !0;
|
|
@@ -35,21 +45,24 @@ class DefaultTimeline {
|
|
|
35
45
|
if (this.paused) return;
|
|
36
46
|
const scaledDelta = delta * this._playSpeed;
|
|
37
47
|
this._currentTime += scaledDelta, this.forEachAccessAnimate(((animate, i) => {
|
|
38
|
-
animate.status === vrender_core_1.AnimateStatus.END ? this.removeAnimate(animate, !0
|
|
39
|
-
}));
|
|
48
|
+
animate.status === vrender_core_1.AnimateStatus.END ? this.removeAnimate(animate, !0) : animate.status !== vrender_core_1.AnimateStatus.RUNNING && animate.status !== vrender_core_1.AnimateStatus.INITIAL || animate.advance(scaledDelta);
|
|
49
|
+
})), 0 === this._animateCount && this.emit("animationEnd");
|
|
40
50
|
}
|
|
41
51
|
clear() {
|
|
42
52
|
this.forEachAccessAnimate((animate => {
|
|
43
53
|
animate.release();
|
|
44
|
-
})), this.
|
|
54
|
+
})), this.head = null, this.tail = null, this.animateMap.clear(), this._animateCount = 0,
|
|
55
|
+
this._totalDuration = 0;
|
|
45
56
|
}
|
|
46
|
-
removeAnimate(animate, release = !0
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
removeAnimate(animate, release = !0) {
|
|
58
|
+
const node = this.animateMap.get(animate);
|
|
59
|
+
node && (release && (animate._onRemove && animate._onRemove.forEach((cb => cb())),
|
|
60
|
+
animate.release()), node.prev ? node.prev.next = node.next : this.head = node.next,
|
|
61
|
+
node.next ? node.next.prev = node.prev : this.tail = node.prev, this.animateMap.delete(animate),
|
|
62
|
+
this._animateCount--, animate.getStartTime() + animate.getDuration() >= this._totalDuration && this.recalculateTotalDuration());
|
|
50
63
|
}
|
|
51
64
|
recalculateTotalDuration() {
|
|
52
|
-
this._totalDuration = 0, this.
|
|
65
|
+
this._totalDuration = 0, this.forEachAccessAnimate((animate => {
|
|
53
66
|
this._totalDuration = Math.max(this._totalDuration, animate.getStartTime() + animate.getDuration());
|
|
54
67
|
}));
|
|
55
68
|
}
|
package/cjs/timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/timeline.ts"],"names":[],"mappings":";;;AAAA,yDAAiG;
|
|
1
|
+
{"version":3,"sources":["../src/timeline.ts"],"names":[],"mappings":"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","file":"timeline.js","sourcesContent":["import { Generator, type IAnimate, type ITimeline, AnimateStatus } from '@visactor/vrender-core';\nimport { EventEmitter } from '@visactor/vutils';\n\n// 定义链表节点\ninterface AnimateNode {\n animate: IAnimate;\n next: AnimateNode | null;\n prev: AnimateNode | null;\n}\n\nexport class DefaultTimeline extends EventEmitter implements ITimeline {\n declare id: number;\n protected head: AnimateNode | null = null;\n protected tail: AnimateNode | null = null;\n protected animateMap: Map<IAnimate, AnimateNode> = new Map();\n protected _animateCount: number = 0;\n protected declare paused: boolean;\n\n // 添加必要的属性\n protected _playSpeed: number = 1;\n protected _totalDuration: number = 0;\n protected _startTime: number = 0;\n protected _currentTime: number = 0;\n\n declare isGlobal?: boolean;\n\n get animateCount() {\n return this._animateCount;\n }\n\n constructor() {\n super();\n this.id = Generator.GenAutoIncrementId();\n this.paused = false;\n }\n\n isRunning() {\n return !this.paused && this._animateCount > 0;\n }\n\n forEachAccessAnimate(cb: (animate: IAnimate, index: number) => void) {\n let current = this.head;\n let index = 0;\n\n while (current) {\n // 保存下一个节点的引用,以防在回调中移除当前节点\n const next = current.next;\n cb(current.animate, index);\n index++;\n current = next;\n }\n }\n\n addAnimate(animate: IAnimate) {\n const newNode: AnimateNode = {\n animate,\n next: null,\n prev: null\n };\n\n // 添加到链表尾部\n if (!this.head) {\n this.head = newNode;\n this.tail = newNode;\n } else {\n if (this.tail) {\n this.tail.next = newNode;\n newNode.prev = this.tail;\n this.tail = newNode;\n }\n }\n\n // 在映射中保存节点引用\n this.animateMap.set(animate, newNode);\n this._animateCount++;\n\n // 更新总时长\n this._totalDuration = Math.max(this._totalDuration, animate.getStartTime() + animate.getDuration());\n }\n\n pause() {\n this.paused = true;\n }\n\n resume() {\n this.paused = false;\n }\n\n tick(delta: number) {\n if (this.paused) {\n return;\n }\n\n // 应用播放速度\n const scaledDelta = delta * this._playSpeed;\n\n // 更新当前时间\n this._currentTime += scaledDelta;\n\n this.forEachAccessAnimate((animate, i) => {\n if (animate.status === AnimateStatus.END) {\n this.removeAnimate(animate, true);\n } else if (animate.status === AnimateStatus.RUNNING || animate.status === AnimateStatus.INITIAL) {\n animate.advance(scaledDelta);\n }\n });\n\n if (this._animateCount === 0) {\n this.emit('animationEnd');\n }\n }\n\n clear() {\n this.forEachAccessAnimate(animate => {\n animate.release();\n });\n\n this.head = null;\n this.tail = null;\n this.animateMap.clear();\n this._animateCount = 0;\n this._totalDuration = 0;\n }\n\n removeAnimate(animate: IAnimate, release: boolean = true) {\n const node = this.animateMap.get(animate);\n\n if (!node) {\n return;\n }\n\n if (release) {\n animate._onRemove && animate._onRemove.forEach(cb => cb());\n animate.release();\n }\n\n // 从链表中移除节点\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n // 节点是头节点\n this.head = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n // 节点是尾节点\n this.tail = node.prev;\n }\n\n // 从映射中移除\n this.animateMap.delete(animate);\n this._animateCount--;\n\n // 如果移除的是最长时间的动画,应该重新计算总时长\n if (animate.getStartTime() + animate.getDuration() >= this._totalDuration) {\n this.recalculateTotalDuration();\n }\n\n return;\n }\n\n // 重新计算总时长\n protected recalculateTotalDuration() {\n this._totalDuration = 0;\n this.forEachAccessAnimate(animate => {\n this._totalDuration = Math.max(this._totalDuration, animate.getStartTime() + animate.getDuration());\n });\n }\n\n getTotalDuration() {\n return this._totalDuration;\n }\n\n getPlaySpeed() {\n return this._playSpeed;\n }\n\n setPlaySpeed(speed: number) {\n this._playSpeed = speed;\n }\n\n // 实现ITimeline接口所需的其他方法\n getPlayState(): 'playing' | 'paused' | 'stopped' {\n if (this.paused) {\n return 'paused';\n }\n if (this.animateCount === 0) {\n return 'stopped';\n }\n return 'playing';\n }\n\n setStartTime(time: number) {\n this._startTime = time;\n }\n\n getStartTime() {\n return this._startTime;\n }\n\n getCurrentTime() {\n return this._currentTime;\n }\n\n setCurrentTime(time: number) {\n this._currentTime = time;\n }\n}\n\n// 不会使用,存粹做临时存储用,请一定要放置到stage中才行\nexport const defaultTimeline = new DefaultTimeline();\ndefaultTimeline.isGlobal = true;\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.isTransformKey = exports.transformKeys = void 0, exports.transformKeys = [ "x", "y", "dx", "dy", "scaleX", "scaleY", "angle", "anchor", "postMatrix", "scrollX", "scrollY" ];
|
|
6
|
+
|
|
7
|
+
const isTransformKey = key => exports.transformKeys.includes(key);
|
|
8
|
+
|
|
9
|
+
exports.isTransformKey = isTransformKey;
|
|
10
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/transform.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;IAC3B,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,SAAS;CACV,CAAC;AACK,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5C,OAAO,qBAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB","file":"transform.js","sourcesContent":["export const transformKeys = [\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'scaleX',\n 'scaleY',\n 'angle',\n 'anchor',\n 'postMatrix',\n 'scrollX',\n 'scrollY'\n];\nexport const isTransformKey = (key: string) => {\n return transformKeys.includes(key);\n};\n"]}
|