原文链接及内容

这个例子展示了如何使用postrender
和vectorContext
对要素进行动画处理。在这里,我们选择做一个每次要素被添加到图层的闪光动画。
main.js
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import Feature from 'ol/Feature.js'; import Map from 'ol/Map.js'; import Point from 'ol/geom/Point.js'; import View from 'ol/View.js'; import {Circle as CircleStyle, Stroke, Style} from 'ol/style.js'; import {OSM, Vector as VectorSource} from 'ol/source.js'; import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer.js'; import {easeOut} from 'ol/easing.js'; import {fromLonLat} from 'ol/proj.js'; import {getVectorContext} from 'ol/render.js'; import {unByKey} from 'ol/Observable.js';
const tileLayer = new TileLayer({ source: new OSM({ wrapX: false, }), });
const source = new VectorSource({ wrapX: false, }); const vector = new VectorLayer({ source: source, });
const map = new Map({ layers: [tileLayer, vector], target: 'map', view: new View({ center: [0, 0], zoom: 1, multiWorld: true, }), });
function addRandomFeature() { const x = Math.random() * 360 - 180; const y = Math.random() * 170 - 85; const geom = new Point(fromLonLat([x, y])); const feature = new Feature(geom); source.addFeature(feature); }
const duration = 3000; function flash(feature) { const start = Date.now(); const flashGeom = feature.getGeometry().clone(); const listenerKey = tileLayer.on('postrender', animate);
function animate(event) { const frameState = event.frameState; const elapsed = frameState.time - start; if (elapsed >= duration) { unByKey(listenerKey); return; } const vectorContext = getVectorContext(event); const elapsedRatio = elapsed / duration; const radius = easeOut(elapsedRatio) * 25 + 5; const opacity = easeOut(1 - elapsedRatio);
const style = new Style({ image: new CircleStyle({ radius: radius, stroke: new Stroke({ color: 'rgba(255, 0, 0, ' + opacity + ')', width: 0.25 + opacity, }), }), });
vectorContext.setStyle(style); vectorContext.drawGeometry(flashGeom); map.render(); } }
source.on('addfeature', function (e) { flash(e.feature); });
window.setInterval(addRandomFeature, 1000);
|
界面布局文件index.html
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Custom Animation</title> <link rel="stylesheet" href="node_modules/ol/ol.css"> <style> .map { width: 100%; height: 400px; } </style> </head> <body> <div id="map" class="map"></div> <script src="https://cdn.jsdelivr.net/npm/elm-pep@1.0.6/dist/elm-pep.js"></script> <script type="module" src="main.js"></script> </body> </html>
|