跳转至

Timeline模块 API 参考

Complete API documentation for the timeline classes and interfaces.

目录


TimelineController

Primary controller that orchestrates all timeline functionality. Implements ITimelineTarget interface.

constructor(config?: Partial)

Creates a new timeline controller with optional configuration. Defaults: - timeScale: 1.0 - timeOffset: 0.0 - timeUpdateMode: 'fixed_delta' - animationSpeed: 1.0 - fixedDeltaTime: 0.016 * 1.10 (~60 FPS) - maxDeltaTime: 0.05 (50ms)

Playback Controls

  • start(speed?: number): void – Start playback with optional speed multiplier
  • pause(): void – Pause playback (preserves current time)
  • resume(): void – Resume from paused state
  • stop(): void – Stop playback and reset frame count

Compatibility Methods:

  • startAnimation(speed?: number): void – Alias for start()
  • pauseAnimation(): void – Alias for pause()
  • resumeAnimation(): void – Alias for resume()
  • stopAnimation(): void – Alias for stop()

Time Controls

  • setTime(time: number): void – Set current time directly (seconds)
  • setSpeed(speed: number): void – Set animation speed multiplier
  • setTimeScale(scale: number): void – Set time scaling factor
  • setTimeOffset(offset: number): void – Set time offset (seconds)
  • setTimeUpdateMode(mode: 'fixed_delta' | 'variable_delta'): void – Set update mode

Compatibility Methods:

  • setAnimationTime(time: number): void – Alias for setTime()
  • setAnimationSpeed(speed: number): void – Alias for setSpeed()

Update

  • update(rafNow?: number): number – Update timeline (call each frame). Returns adjusted time. If rafNow not provided, uses performance.now()

Queries

Time:

  • getCurrentTime(): number – Get current adjusted time
  • getFrameTime(): number – Get raw frame time (before adjustment)
  • getAdjustedTime(): number – Alias for getCurrentTime()

State:

  • getPlaybackState(): AnimationPlaybackState – Get current playback state
  • isPlaying(): boolean – Check if playing
  • isPaused(): boolean – Check if paused
  • isStopped(): boolean – Check if stopped
  • supportsAnimation(): boolean – Always returns true

Configuration:

  • getAnimationSpeed(): number – Get current animation speed
  • getTimeScale(): number – Get current time scale
  • getTimeOffset(): number – Get current time offset
  • getTimeUpdateMode(): 'fixed_delta' | 'variable_delta' – Get current update mode

Advanced:

  • isFallbackPreviewMode(): boolean – Check if in fallback preview mode (frameTime < -0.5)
  • getStats(): TimelineStats – Get comprehensive statistics

Events

  • addEventListener(listener: TimelineEventListener): void – Register event listener
  • removeEventListener(listener: TimelineEventListener): void – Remove event listener
  • clearEventListeners(): void – Clear all event listeners

Static Properties

  • TimelineController.FALLBACK_PREVIEW_THRESHOLD – Constant: -0.5 (threshold for fallback preview mode)

AnimationState

Tracks playback state and manages state transitions with validation.

constructor()

Creates a new animation state manager. Initial state: STOPPED, speed: 1.0.

Playback Control

  • play(speed?: number = 1.0): void – Start playing. Speed is clamped to minimum 0.1x.
  • pause(): void – Pause (only if currently playing)
  • resume(): void – Resume (only if currently paused)
  • stop(): void – Stop and reset to stopped state
  • reset(): void – Reset to stopped state with speed 1.0

Speed Control

  • setSpeed(speed: number): void – Set animation speed (clamped to minimum 0.1x). Emits speedChange event if changed.
  • getSpeed(): number – Get current animation speed

State Queries

Properties (read-only):

  • playbackState: AnimationPlaybackState – Current playback state
  • animationSpeed: number – Current animation speed
  • isPlaying: boolean – True if playing
  • isPaused: boolean – True if paused
  • isStopped: boolean – True if stopped

Methods:

  • getState(): AnimationPlaybackState – Get current state
  • getStateInfo(): object – Get comprehensive state information

Events

  • addEventListener(listener: TimelineEventListener): void – Register event listener
  • removeEventListener(listener: TimelineEventListener): void – Remove event listener
  • clearEventListeners(): void – Clear all event listeners

Event Types:

  • play – Emitted when playback starts
  • pause – Emitted when playback pauses
  • resume – Emitted when playback resumes
  • stop – Emitted when playback stops
  • speedChange – Emitted when speed changes (includes oldSpeed and newSpeed in data)

TimeCalculator

Performs time scaling, offset calculations, and delta time computation.

constructor(config?: Partial)

Creates a new time calculator with optional configuration. Uses defaults if not provided.

Time Control

  • setTime(time: number): void – Set frame time directly (resets last update time for variable mode)
  • resetTime(): void – Reset frame time to 0
  • setTimeScale(scale: number): void – Set time scaling factor (clamped to minimum 0.01)
  • getTimeScale(): number – Get current time scale
  • setTimeOffset(offset: number): void – Set time offset (seconds)
  • getTimeOffset(): number – Get current time offset

Update Mode

  • setTimeUpdateMode(mode: 'fixed_delta' | 'variable_delta'): void – Set update mode (resets last update time for variable mode)
  • getTimeUpdateMode(): 'fixed_delta' | 'variable_delta' – Get current update mode

Animation Speed

  • setAnimationSpeed(speed: number): void – Set animation speed (clamped to minimum 0.1x)
  • getAnimationSpeed(): number – Get current animation speed

Time Calculation

  • calculateTime(rafNow?: number, isPlaying?: boolean, isPaused?: boolean): TimeCalculationResult – Calculate time delta and update frame time. Returns:
  • deltaTime: number – Calculated time delta
  • frameTime: number – Accumulated frame time
  • adjustedTime: number – Time with scaling and offset applied
  • shouldUpdate: boolean – Whether time was updated

Queries

Properties (read-only):

  • frameTime: number – Current frame time (before adjustment)
  • config: Readonly<TimelineConfig> – Current configuration

Methods:

  • getAdjustedTime(): number – Get adjusted time (with scaling and offset)
  • getStats(): object – Get comprehensive statistics

Configuration

  • updateConfig(newConfig: Partial<TimelineConfig>): void – Update configuration
  • clone(): TimeCalculator – Clone calculator with current state

TimeUpdateMode

Enum and helper utilities for time update modes.

TimeUpdateMode Enum

enum TimeUpdateMode {
  FIXED_DELTA = 'fixed_delta',      // Deterministic fixed steps
  VARIABLE_DELTA = 'variable_delta'  // Frame-rate dependent
}

TimeUpdateModeHelper

Static helper class for time update mode operations.

Delta Calculation:

  • calculateDeltaTime(params): number – Calculates time delta based on mode:

params: {
  mode: TimeUpdateMode;
  currentTime: number;        // performance.now()
  lastUpdateTime: number;      // Previous update time
  fixedDeltaTime: number;      // Fixed delta value
  maxDeltaTime: number;        // Max delta clamp
}
- Fixed Delta: Returns fixedDeltaTime directly - Variable Delta: Calculates from time difference, clamped to maxDeltaTime

Validation:

  • isValidMode(mode: string): mode is TimeUpdateMode – Type guard to check if mode is valid
  • fromString(modeString: string): TimeUpdateMode – Converts string to enum (defaults to FIXED_DELTA if invalid)

Defaults:

  • getDefaultFixedDeltaTime(): number – Returns 0.016 * 1.10 (~60 FPS)
  • getDefaultMaxDeltaTime(): number – Returns 0.05 (50ms)

Descriptions:

  • getModeDescription(mode: TimeUpdateMode): string – Returns human-readable description

Types and Interfaces

TimelineConfig

interface TimelineConfig {
  /** Time scaling factor (1.0 = normal, 2.0 = 2x, 0.5 = 0.5x) */
  timeScale: number;
  /** Time offset in seconds */
  timeOffset: number;
  /** Time update mode */
  timeUpdateMode: 'fixed_delta' | 'variable_delta';
  /** Animation speed multiplier */
  animationSpeed: number;
  /** Fixed delta time in seconds (for fixed_delta mode) */
  fixedDeltaTime: number;
  /** Maximum delta time in seconds (clamp for variable_delta mode) */
  maxDeltaTime: number;
}

TimelineStats

interface TimelineStats {
  /** Current frame time */
  currentTime: number;
  /** Adjusted time (with scaling and offset) */
  adjustedTime: number;
  /** Time scaling factor */
  timeScale: number;
  /** Time offset */
  timeOffset: number;
  /** Time update mode */
  timeUpdateMode: string;
  /** Animation speed */
  animationSpeed: number;
  /** Playback state */
  playbackState: AnimationPlaybackState;
  /** Whether currently playing */
  isPlaying: boolean;
  /** Whether currently paused */
  isPaused: boolean;
  /** Whether currently stopped */
  isStopped: boolean;
  /** Last update timestamp */
  lastUpdateTime: number;
  /** Accumulated frame count */
  frameCount: number;
}

AnimationPlaybackState

enum AnimationPlaybackState {
  STOPPED = 'stopped',
  PLAYING = 'playing',
  PAUSED = 'paused'
}

TimeCalculationResult

interface TimeCalculationResult {
  /** Calculated time delta */
  deltaTime: number;
  /** Accumulated frame time */
  frameTime: number;
  /** Adjusted time (with scaling and offset) */
  adjustedTime: number;
  /** Whether time was updated */
  shouldUpdate: boolean;
}

TimeCalculationParams

interface TimeCalculationParams {
  /** Current timestamp (performance.now()) */
  currentTime: number;
  /** Last update timestamp */
  lastUpdateTime: number;
  /** Time scaling factor */
  timeScale: number;
  /** Animation speed multiplier */
  animationSpeed: number;
  /** Time update mode */
  timeUpdateMode: 'fixed_delta' | 'variable_delta';
  /** Fixed delta time */
  fixedDeltaTime: number;
  /** Maximum delta time */
  maxDeltaTime: number;
}

AnimationStateChangeEvent

interface AnimationStateChangeEvent {
  /** Event type */
  type: 'play' | 'pause' | 'resume' | 'stop' | 'timeChange' | 'speedChange';
  /** Event timestamp */
  timestamp: number;
  /** Event data (varies by type) */
  data?: any;
}

TimelineEventListener

type TimelineEventListener = (event: AnimationStateChangeEvent) => void;

ITimelineTarget

Interface implemented by TimelineController for consistent API:

interface ITimelineTarget {
  // Playback control
  startAnimation(speed?: number): void;
  pauseAnimation(): void;
  resumeAnimation(): void;
  stopAnimation(): void;

  // Time control
  setAnimationTime(time: number): void;
  setAnimationSpeed(speed: number): void;
  getAnimationSpeed(): number;

  // Time scaling
  setTimeScale(scale: number): void;
  getTimeScale(): number;
  setTimeOffset(offset: number): void;
  getTimeOffset(): number;

  // Update mode
  setTimeUpdateMode(mode: 'fixed_delta' | 'variable_delta'): void;
  getTimeUpdateMode(): 'fixed_delta' | 'variable_delta';

  // Queries
  getCurrentTime(): number;
  supportsAnimation(): boolean;
}

Usage Examples

Basic Timeline Usage

import { TimelineController } from './timeline';

const timeline = new TimelineController({
  timeScale: 1.0,
  animationSpeed: 1.0,
  timeUpdateMode: 'fixed_delta',
  fixedDeltaTime: 0.016,
});

timeline.addEventListener(event => {
  console.log('Timeline event:', event);
});

timeline.start();

function animate() {
  requestAnimationFrame(animate);
  const currentTime = timeline.update(performance.now());
  updateAnimations(currentTime);
}

Variable Delta Mode

const timeline = new TimelineController({
  timeScale: 2.0,
  timeOffset: 5.0,
  animationSpeed: 1.5,
  timeUpdateMode: 'variable_delta',
  maxDeltaTime: 0.05,
});

timeline.setTimeScale(0.5);
timeline.setTimeOffset(10.0);

const stats = timeline.getStats();
console.log('Timeline stats:', stats);

State Management

if (timeline.isPlaying()) {
  console.log('Animation is playing');
}

timeline.pause();
// ... custom logic
timeline.resume();

timeline.stop();
timeline.setTime(0);

Event Handling

timeline.addEventListener((event) => {
  switch (event.type) {
    case 'play':
      console.log('Animation started at speed:', event.data.speed);
      break;
    case 'pause':
      console.log('Animation paused');
      break;
    case 'timeChange':
      console.log('Time changed to:', event.data.time);
      break;
    case 'speedChange':
      console.log('Speed changed:', event.data.oldSpeed, '→', event.data.newSpeed);
      break;
  }
});

Fallback Preview Mode

if (timeline.isFallbackPreviewMode()) {
  console.log('In fallback preview mode');
  // Handle preview/export scenario
}

Integration with AnimationManager

// In render loop
const time = timeline.update(performance.now());
animationManager.setDynamicAnimationTime(time);

Notes

  1. Update Modes:
  2. fixed_delta – Use for deterministic steps (physics, deterministic animations)
  3. variable_delta – Use for smooth playback (frame-rate dependent animations)

  4. Performance:

  5. Avoid calling setTime() every frame; prefer event listeners over polling
  6. Use update() method in render loop for automatic time progression
  7. Event listeners are batched and error-handled

  8. Precision:

  9. Uses performance.now() for high-precision timing
  10. Microsecond precision is supported
  11. Time values are in seconds

  12. State Synchronization:

  13. State changes automatically trigger events
  14. Events include timestamp and relevant data
  15. Listeners are called synchronously

  16. Validation:

  17. Invalid config values are clamped to safe ranges:
    • timeScale: minimum 0.01
    • animationSpeed: minimum 0.1x
    • maxDeltaTime: clamps variable delta to prevent extreme values
  18. State transitions are validated (e.g., can't pause if not playing)

  19. Fallback Preview Mode:

  20. Detected when frameTime < -0.5
  21. Useful for export/recording scenarios
  22. Access via isFallbackPreviewMode() or TimelineController.FALLBACK_PREVIEW_THRESHOLD

  23. Compatibility:

  24. TimelineController provides compatibility methods for legacy code
  25. Both new API (start(), pause()) and legacy API (startAnimation(), pauseAnimation()) are supported