七章-82-水纹效果

作者: 彩云飘过 | 来源:发表于2020-03-27 17:55 被阅读0次

本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers 5.3.x api。

源码 见 1082.html ,对应的 官网示例 https://openlayers.org/en/latest/examples/feature-animation.html?q=Geometry

image.png
map.on('postcompose', function(event) {})
绑定了layer的'postcompose'事件
根据framestate的时间计算波纹半径
<!DOCTYPE html>
<html>

<head>
 <title>水纹效果</title>
 <link rel="stylesheet" href="../include/ol.css" type="text/css" />
 <script src="../include/ol.js"></script>
</head>
<style></style>

<body>

 <div id="map" class="map"></div>

<script>
   var map = new ol.Map({
     layers: [
       new ol.layer.Tile({
         source: new ol.source.OSM({
           wrapX: false //控制是否重复显示地图
         })
       })
     ],
     target: 'map',
     view: new ol.View({
       center: [0, 0],
       zoom: 1
     })
   });

   var source = new ol.source.Vector({
     wrapX: false
   });
   var vector = new ol.layer.Vector({
     source: source
   });
   map.addLayer(vector);

   //添加一个位置随机的要素
   function addRandomFeature() {
     var x = Math.random() * 360 - 180;
     var y = Math.random() * 180 - 90;
     var geom = new ol.geom.Point(ol.proj.fromLonLat([x, y]));
     var feature = new ol.Feature(geom);
     source.addFeature(feature);
   }

   var duration = 3000; //超过3秒中,动画就终止,所以同一时间只有三个动画效果
   //实现动画效果的函数
   function flash(feature) {
     var start = new Date().getTime();
     var listenerKey = map.on('postcompose', animate);
     //绑定后渲染事件,可看做动画的“start”  
     function animate(event) {
       var vectorContext = event.vectorContext;
       var frameState = event.frameState;
       var flashGeom = feature.getGeometry().clone();//克隆方法,获取当前动画的点位坐标集合
       var elapsed = frameState.time - start; //计算出动画已经执行的事件
       var elapsedRatio = elapsed / duration;//计算出动画执行进度
       //easeOut返回一个0-1之间的数值,渐变式,速度逐渐减慢
       var radius = ol.easing.easeOut(elapsedRatio) * 25 + 5;//计算半径
       var opacity = ol.easing.easeOut(1 - elapsedRatio);//计算透明度
       console.log(elapsedRatio);
       
       console.log("easeOut:"+ol.easing.easeOut(elapsedRatio));

       var style = new ol.style.Style({
         image: new ol.style.Circle({
           radius: radius,
           stroke: new ol.style.Stroke({
             color: 'rgba(255, 0, 0, ' + opacity + ')',
             width: 0.25 + opacity
           })
         })
       });
       //通过设置样式来实现图形的变化
       vectorContext.setStyle(style);
       vectorContext.drawGeometry(flashGeom);
       //超过3秒钟就取消绑定
       if (elapsed > duration) {
         ol.Observable.unByKey(listenerKey); //解绑事件,结束动画效果
         return;
       }
       //可看做动画的“下一帧”
       map.render();
     }
   }
   //绑定了addFeature事件,回调函数中调用了flash这个工具函数
   source.on('addfeature', function (e) {
     flash(e.feature);
   });

   //每隔1秒添加一个位置随机的要素
   window.setInterval(addRandomFeature, 1000);
 </script>
</body>

</html>

相关文章

网友评论

    本文标题:七章-82-水纹效果

    本文链接:https://www.haomeiwen.com/subject/usbluhtx.html