| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Lottie Filmstrip Capture</title> |
| <meta charset="utf-8" /> |
| <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <script src="/lottie.js" type="text/javascript" charset="utf-8"></script> |
| <style type="text/css" media="screen"> |
| body, |
| main, |
| .anim { |
| margin: 0; |
| padding: 0; |
| } |
| |
| main { |
| display: flex; |
| width: 1000px; |
| height: 1000px; |
| flex-flow: row wrap; |
| } |
| </style> |
| </head> |
| <body> |
| <main> |
| <div class=anim></div> |
| </main> |
| <script type="text/javascript" charset="utf-8"> |
| (function () { |
| const TILE_COUNT = 5; // Number of tiles in x or y direction. |
| const TARGET_SIZE = 1000; // Image size in pixels both x and y direction. |
| const PATH = '/lottie.json'; |
| |
| // This global is used by puppeteer to determine if all tiles have finished drawing. |
| window._tileCount = 0; |
| |
| // First load the animation for just a single tile |
| // so we can read out some values and calculate what |
| // the filmstrip should look like. |
| let anim = lottie.loadAnimation({ |
| container: document.querySelector('.anim'), |
| renderer: 'svg', |
| loop: false, |
| autoplay: true, |
| path: PATH, |
| rendererSettings: { |
| preserveAspectRatio:'xMidYMid meet' |
| }, |
| }); |
| |
| anim.addEventListener('data_ready', (e) => { |
| // Once the first tile is loaded, calculate what |
| // the filmstrip should look like. |
| let width = anim.animationData.w; |
| let height = anim.animationData.h; |
| let scale = TARGET_SIZE / (TILE_COUNT * Math.max(width, height)); |
| let tileWidth = Math.ceil(scale * width); |
| let tileHeight = Math.ceil(scale * height); |
| |
| let inPoint = (anim.animationData.ip || 0) / anim.frameRate; |
| let outPoint = (anim.animationData.op || (anim.animationData.totalFrames - 1)) / anim.frameRate; |
| let frameStep = (outPoint - inPoint) / (TILE_COUNT * TILE_COUNT - 1); |
| |
| let main = document.querySelector('main'); |
| |
| let renderer = 'svg'; |
| let hash = window.location.hash; |
| if (hash) { |
| renderer = hash.slice(1); |
| } |
| |
| // Clear out the first div now that our measurements are done. |
| main.firstElementChild.remove(); |
| |
| // Add in all the tiles. |
| for (let i = 0; i < TILE_COUNT*TILE_COUNT; i++) { |
| let div = document.createElement('div'); |
| div.classList.add('anim'); |
| div.style.width = tileWidth + 'px'; |
| div.style.height = tileHeight + 'px'; |
| main.appendChild(div); |
| |
| let frameStop = i * frameStep; |
| |
| let anim = lottie.loadAnimation({ |
| container: div, |
| renderer: renderer, |
| loop: false, |
| autoplay: false, |
| path: PATH, |
| rendererSettings: { |
| preserveAspectRatio:'xMidYMid meet' |
| }, |
| }); |
| |
| anim.addEventListener('data_ready', (e) => { |
| console.log(frameStop*1000); |
| // Once data is loaded, jump to the right frame. |
| anim.goToAndStop(frameStop * anim.frameRate, true); |
| window._tileCount += 1; |
| }); |
| } |
| }); |
| })(); |
| </script> |
| </body> |
| </html> |