From 9c7a97787a7b136af03a123ffc02edf452fa75b1 Mon Sep 17 00:00:00 2001 From: Jinny You Date: Wed, 22 May 2024 18:06:11 +0900 Subject: [PATCH] web: Reduce initial playing resources Previously, the Intersection Observer doesn't filter hidden animations when page just loaded. Ensure that the only visible animations to be played. Hidden resources will be frozen in the initial load. --- web/src/lottie-player.ts | 41 +++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/web/src/lottie-player.ts b/web/src/lottie-player.ts index 9546bb13..b592d56d 100644 --- a/web/src/lottie-player.ts +++ b/web/src/lottie-player.ts @@ -151,20 +151,6 @@ const _wait = (timeToDelay: number) => { return new Promise((resolve) => setTimeout(resolve, timeToDelay)) }; -const _observerCallback = (entries: IntersectionObserverEntry[]) => { - const entry = entries[0]; - const target = entry.target as LottiePlayer; - - if (entry.isIntersecting) { - if (target.currentState === PlayerState.Frozen) { - target.play(); - } - } else if (target.currentState === PlayerState.Playing) { - target.freeze(); - target.dispatchEvent(new CustomEvent(PlayerEvent.Freeze)); - } -} - const _downloadFile = (fileName: string, blob: Blob) => { const link = document.createElement('a'); link.setAttribute('href', URL.createObjectURL(blob)); @@ -276,6 +262,7 @@ export class LottiePlayer extends LitElement { private _counter: number = 1; private _timer?: ReturnType; private _observer?: IntersectionObserver; + private _observable: boolean = false; private async _init(): Promise { if (!_module) { @@ -298,12 +285,27 @@ export class LottiePlayer extends LitElement { } } + private _observerCallback(entries: IntersectionObserverEntry[]) { + const entry = entries[0]; + const target = entry.target as LottiePlayer; + target._observable = entry.isIntersecting; + + if (entry.isIntersecting) { + if (target.currentState === PlayerState.Frozen) { + target.play(); + } + } else if (target.currentState === PlayerState.Playing) { + target.freeze(); + target.dispatchEvent(new CustomEvent(PlayerEvent.Freeze)); + } + } + protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { this._canvas = this.shadowRoot!.querySelector('#thorvg-canvas') as HTMLCanvasElement; this._canvas.width = this._canvas.offsetWidth; this._canvas.height = this._canvas.offsetHeight; - this._observer = new IntersectionObserver(_observerCallback); + this._observer = new IntersectionObserver(this._observerCallback); this._observer.observe(this); if (!this._TVG) { @@ -457,8 +459,13 @@ export class LottiePlayer extends LitElement { return; } - this.currentState = PlayerState.Playing; - window.requestAnimationFrame(this._animLoop.bind(this)); + if (this._observable) { + this.currentState = PlayerState.Playing; + window.requestAnimationFrame(this._animLoop.bind(this)); + return; + } + + this.currentState = PlayerState.Frozen; } /**