瀏覽代碼

Simplify the ViewportResizer

customisations
alemart 1 年之前
父節點
當前提交
368452dac3
共有 1 個文件被更改,包括 71 次插入70 次删除
  1. 71
    70
      src/core/viewport.ts

+ 71
- 70
src/core/viewport.ts 查看文件

428
     /** the viewport to be resized */
428
     /** the viewport to be resized */
429
     private readonly _viewport: Viewport;
429
     private readonly _viewport: Viewport;
430
 
430
 
431
-    /** is this viewport subject to being resized? */
432
-    private _active: boolean;
431
+    /** a helper */
432
+    private _timeout: Nullable<ReturnType<typeof setTimeout>>;
433
 
433
 
434
     /** bound resize method */
434
     /** bound resize method */
435
     private readonly _resize: () => void;
435
     private readonly _resize: () => void;
436
 
436
 
437
+    /** bound event trigger */
438
+    private readonly _triggerResize: () => void;
439
+
437
     /** resize strategy */
440
     /** resize strategy */
438
     private _resizeStrategy: ViewportResizeStrategy;
441
     private _resizeStrategy: ViewportResizeStrategy;
439
 
442
 
447
     constructor(viewport: Viewport)
450
     constructor(viewport: Viewport)
448
     {
451
     {
449
         this._viewport = viewport;
452
         this._viewport = viewport;
450
-        this._active = false;
453
+        this._timeout = null;
451
         this._resize = this._onResize.bind(this);
454
         this._resize = this._onResize.bind(this);
455
+        this._triggerResize = this.triggerResize.bind(this);
452
         this._resizeStrategy = new InlineResizeStrategy();
456
         this._resizeStrategy = new InlineResizeStrategy();
453
 
457
 
454
         // initial setup
458
         // initial setup
455
         // (the size is yet unknown)
459
         // (the size is yet unknown)
456
-        this._resize();
460
+        this._viewport.addEventListener('resize', this._resize);
461
+        this.triggerResize(0);
457
     }
462
     }
458
 
463
 
459
     /**
464
     /**
461
      */
466
      */
462
     init(): void
467
     init(): void
463
     {
468
     {
464
-        // Configure the resize listener. We want the viewport
465
-        // to adjust itself if the phone/screen is resized or
466
-        // changes orientation
467
-        let timeout: Nullable<ReturnType<typeof setTimeout>> = null;
468
-        const onWindowResize = () => {
469
-            if(!this._active) {
470
-                window.removeEventListener('resize', onWindowResize);
471
-                return;
472
-            }
473
-
474
-            if(timeout !== null)
475
-                clearTimeout(timeout);
476
-
477
-            timeout = setTimeout(() => {
478
-                timeout = null;
479
-                this._resize();
480
-            }, 50);
481
-        };
482
-        window.addEventListener('resize', onWindowResize);
469
+        // Configure the resize listener. We want the viewport to adjust itself
470
+        // if the phone/screen is resized or changes orientation
471
+        window.addEventListener('resize', this._triggerResize); // a delay is welcome
483
 
472
 
484
         // handle changes of orientation
473
         // handle changes of orientation
485
         // (is this needed? we already listen to resize events)
474
         // (is this needed? we already listen to resize events)
486
         if(screen.orientation !== undefined)
475
         if(screen.orientation !== undefined)
487
-            screen.orientation.addEventListener('change', this._resize);
476
+            screen.orientation.addEventListener('change', this._triggerResize);
488
         else
477
         else
489
-            window.addEventListener('orientationchange', this._resize); // deprecated
490
-
491
-        // setup event listener & finish!
492
-        this._viewport.addEventListener('resize', this._resize);
493
-        this._active = true;
478
+            window.addEventListener('orientationchange', this._triggerResize); // deprecated
494
 
479
 
495
         // trigger a resize to setup the sizes / the CSS
480
         // trigger a resize to setup the sizes / the CSS
496
-        this.resize();
481
+        this.triggerResize(0);
497
     }
482
     }
498
 
483
 
499
     /**
484
     /**
501
      */
486
      */
502
     release(): void
487
     release(): void
503
     {
488
     {
504
-        this._resizeStrategy.clear(this._viewport);
505
-        this._active = false;
506
-        this._viewport.removeEventListener('resize', this._resize);
507
-
508
         if(screen.orientation !== undefined)
489
         if(screen.orientation !== undefined)
509
-            screen.orientation.removeEventListener('change', this._resize);
490
+            screen.orientation.removeEventListener('change', this._triggerResize);
510
         else
491
         else
511
-            window.removeEventListener('orientationchange', this._resize); // deprecated
492
+            window.removeEventListener('orientationchange', this._triggerResize);
493
+
494
+        window.removeEventListener('resize', this._triggerResize);
495
+
496
+        this._viewport.removeEventListener('resize', this._resize);
497
+        this._resizeStrategy.clear(this._viewport);
512
     }
498
     }
513
 
499
 
514
     /**
500
     /**
515
-     * Trigger a resize event
501
+     * Trigger a resize event after a delay
502
+     * @param delay in milliseconds
516
      */
503
      */
517
-    resize(): void
504
+    triggerResize(delay: number = 50): void
518
     {
505
     {
519
         const event = new ViewportEvent('resize');
506
         const event = new ViewportEvent('resize');
520
-        this._viewport.dispatchEvent(event);
507
+
508
+        if(delay <= 0) {
509
+            this._viewport.dispatchEvent(event);
510
+            return;
511
+        }
512
+
513
+        if(this._timeout !== null)
514
+            clearTimeout(this._timeout);
515
+
516
+        this._timeout = setTimeout(() => {
517
+            this._timeout = null;
518
+            this._viewport.dispatchEvent(event);
519
+        }, delay);
521
     }
520
     }
522
 
521
 
523
     /**
522
     /**
528
     {
527
     {
529
         this._resizeStrategy.clear(this._viewport);
528
         this._resizeStrategy.clear(this._viewport);
530
         this._resizeStrategy = strategy;
529
         this._resizeStrategy = strategy;
531
-        this.resize();
530
+        this.triggerResize(0);
531
+    }
532
+
533
+    /**
534
+     * Change the resize strategy
535
+     * @param strategyName name of the new strategy
536
+     */
537
+    setStrategyByName(strategyName: ViewportStyle): void
538
+    {
539
+        switch(strategyName) {
540
+            case 'best-fit':
541
+                this.setStrategy(new BestFitResizeStrategy());
542
+                break;
543
+
544
+            case 'stretch':
545
+                this.setStrategy(new StretchResizeStrategy());
546
+                break;
547
+
548
+            case 'inline':
549
+                this.setStrategy(new InlineResizeStrategy());
550
+                break;
551
+
552
+            default:
553
+                throw new IllegalArgumentError('Invalid viewport style: ' + strategyName);
554
+        }
532
     }
555
     }
533
 
556
 
534
     /**
557
     /**
714
     protected readonly _hud: HUD;
737
     protected readonly _hud: HUD;
715
 
738
 
716
     /** Viewport style */
739
     /** Viewport style */
717
-    protected _style: Nullable<ViewportStyle>;
740
+    protected _style: ViewportStyle;
718
 
741
 
719
     /** The canvases of the viewport */
742
     /** The canvases of the viewport */
720
     private readonly _canvases: ViewportCanvases;
743
     private readonly _canvases: ViewportCanvases;
746
         this._mediaSize = () => initialSize;
769
         this._mediaSize = () => initialSize;
747
 
770
 
748
         this._resolution = settings.resolution;
771
         this._resolution = settings.resolution;
749
-        this._style = null;
772
+        this._style = settings.style;
773
+
750
         this._containers = new ViewportContainers(settings.container);
774
         this._containers = new ViewportContainers(settings.container);
751
         this._hud = new HUD(this._subContainer, settings.hudContainer);
775
         this._hud = new HUD(this._subContainer, settings.hudContainer);
752
         this._canvases = new ViewportCanvases(this._subContainer, initialSize, settings.canvas);
776
         this._canvases = new ViewportCanvases(this._subContainer, initialSize, settings.canvas);
753
 
777
 
754
         this._fullscreen = new ViewportFullscreenHelper(this.container);
778
         this._fullscreen = new ViewportFullscreenHelper(this.container);
755
         this._resizer = new ViewportResizer(this);
779
         this._resizer = new ViewportResizer(this);
756
-        this.style = settings.style;
780
+        this._resizer.setStrategyByName(this._style);
757
     }
781
     }
758
 
782
 
759
     /**
783
     /**
769
      */
793
      */
770
     get style(): ViewportStyle
794
     get style(): ViewportStyle
771
     {
795
     {
772
-        if(this._style === null)
773
-            throw new IllegalOperationError();
774
-
775
         return this._style;
796
         return this._style;
776
     }
797
     }
777
 
798
 
780
      */
801
      */
781
     set style(value: ViewportStyle)
802
     set style(value: ViewportStyle)
782
     {
803
     {
783
-        // nothing to do
784
-        if(value === this._style)
785
-            return;
786
-
787
-        // change style
788
-        switch(value) {
789
-            case 'best-fit':
790
-                this._resizer.setStrategy(new BestFitResizeStrategy());
791
-                break;
792
-
793
-            case 'stretch':
794
-                this._resizer.setStrategy(new StretchResizeStrategy());
795
-                break;
796
-
797
-            case 'inline':
798
-                this._resizer.setStrategy(new InlineResizeStrategy());
799
-                break;
800
-
801
-            default:
802
-                throw new IllegalArgumentError('Invalid viewport style: ' + value);
803
-        }
804
-
805
-        this._style = value;
806
-
807
         // note: the viewport style is independent of the session mode!
804
         // note: the viewport style is independent of the session mode!
805
+        if(value !== this._style) {
806
+            this._resizer.setStrategyByName(value);
807
+            this._style = value;
808
+        }
808
     }
809
     }
809
 
810
 
810
     /**
811
     /**

Loading…
取消
儲存