前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ol中闪烁点动画的实现

ol中闪烁点动画的实现

作者头像
lzugis
发布2019-08-29 11:27:39
1.7K0
发布2019-08-29 11:27:39
举报

概述

本文讲述如何在ol中实现闪烁点动画。

实现效果

实现后效果
实现后效果

实现思路

实现如图的动画,可以用两种思路: 1.overlay+css3动画实现; 2.canvas动画实现。

实现

1、overlay+css3实现

css的实现如下:

代码语言:javascript
复制
@keyframes animate {
  0% { transform: scale(0.3); }
  100% { transform: scale(1); }
}

.animate-overlay {
	width: 30px; 
	height: 30px;
	background: radial-gradient(circle, red, rgba(255, 0, 0, 0));
	border: 1px solid red;
	border-radius: 50%;
	animation: 1s animate infinite;
}
代码语言:javascript
复制
for(var i = 0;i<data.length;i++) {
  var d = data[i];
  var coord = ol.proj.fromLonLat([d.lon, d.lat]);
  var element = document.createElement('div');
  element.classList.add('animate-overlay');
  var overlay = new ol.Overlay({
	  element: element,
  })
  map.addOverlay(overlay);
  overlay.setPosition(coord);
}

2、canvas动画实现

代码语言:javascript
复制
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var gradCircle = new GradCircle(ctx);
var radius = 15,
  changeRadius = 0.5;

var imageLayer = new ol.layer.Image({
  source: null,
  zIndex: 2
});
map.addLayer(imageLayer);
var source = new ol.source.ImageCanvas({
  canvasFunction: canvasFunction
});
imageLayer.setSource(source);
var playFlag = null;


window.requestAnimationFrame =(
  window.webkitRequestAnimationFrame||
  window.mozRequestAnimationFrame||
  window.oRequestAnimationFrame||
  window.msRequestAnimationFrame||
  function(callback){
    return window.setTimeout(callback,1000/60);
  }
);

function refresh() {
  playFlag = window.requestAnimationFrame(refresh);
  source.refresh();
}

map.on('movestart', function () {
  window.cancelAnimationFrame(playFlag);
});
map.on('moveend', function () {
  resetState();
});

function canvasFunction(extent, res, pixelRatio, size) {
  canvas.setAttribute('width', size[0]);
  canvas.setAttribute('height', size[1]);
  ctx.clearRect(0, 0 , size[0], size[1]);
  var mapExtent = map.getView().calculateExtent();
  var mapTopLeft = [mapExtent[0], mapExtent[3]];
  var topLeft = [extent[0], extent[3]];
  var tlSrc = map.getPixelFromCoordinate(topLeft);
  var tlMapSrc = map.getPixelFromCoordinate(mapTopLeft);
  var xOff = tlMapSrc[0] - tlSrc[0],
    yOff = tlMapSrc[1] - tlSrc[1];
  //浏览器存在多方的状态下
  ctx.scale(pixelRatio, pixelRatio);
  for(var i = 0;i<data.length;i++) {
    var d = data[i];
    var lonlat = [d.lon, d.lat];
    var coord = ol.proj.fromLonLat(lonlat);
    if(ol.extent.containsCoordinate(mapExtent, coord)) {
      var pixel = map.getPixelFromCoordinate(coord);
      var x = pixel[0] + xOff,
        y = pixel[1] + yOff;
      d.radius = d.radius + changeRadius;
      if(d.radius > radius * 2) d.radius = radius;
      gradCircle.drawGradCircle(x, y, d.radius);
    }
  }
  return canvas;
}
resetState();
function resetState(){
  for(var i = 0;i<data.length;i++) {
    var d = data[i];
    d.radius = radius;
  }
  refresh();
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年08月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 实现效果
  • 实现思路
  • 实现
    • 1、overlay+css3实现
      • 2、canvas动画实现
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档