让高德地图上点标记显示发光效果
第一次写东西,技术水平不是很高,只是为了方便记忆。
最近项目中有一个在地图上显示定位的需求,这本来没什么,只要初始化一个地图,将后台传过来的定位信息通过高德API在地图上显示就行了,最主要的是需要让点像光源一样有闪烁的效果,本来是想在网上找一下copy的,结果没找到。所以自己研究了一下。
为了方便记忆,所以会将从怎么创建地图,到显示定位点的整个过程纪录下来。
首先声明这里用的是vue加高德API,第一步,将高德API引入vue,在这里先将下面这句代码放到index.html的头部。
<script src="https://webapi.amap.com/maps?v=1.4.10&key=你的key值"></script>
然后在webpack.base.conf.js中加入,这里window.AMap好像可以直接写AMap
externals: { 'AMap': 'window.AMap' }
然后在你需要的界面引用就行了
import AMap from 'AMap'
到此为止,是前期的准备工作。
接下来开始创建地图了,因为有时需要在地图上做数据更新,所以需要把地图的创建用一个方法提取出来,只在mounted里调用一次就行,避免数据更新是重复创建。
initmap() { //创建地图 this.map = new AMap.Map("container", { center: [120.061897, 30.356648], //设置中心点 // pitch: 60, // rotation: -35, resizeEnable: true, //是否监控地图容器尺寸变化 features: ["bg", "road", "point"], //隐藏默认楼块 mapStyle: "amap://styles/bf8a443a1cae459d53212187f63b444c", //设置地图的显示样式 // layers: [new AMap.TileLayer.Satellite()], //地图图层(卫星图层) new AMap.TileLayer() zoom: 16 //地图显示的缩放级别 }); }
这里值得注意的是mapStyle这个参数的值里bf8a443a1cae459d53212187f63b444c这个值,是我登录高德开发者平台,在自定义地图里自己创建发布的一个地图样式,个人认为根据图片创建地图更舒服一些。
接下来,因为我们的后台数据还没有对接好,所以自己定义了一条假数据。
var capitals = [ { center:[120.060824,30.357574], color:'#00e921', animations:'myfirst01' }, { center:[120.061824,30.358574], color:'#fffa02', animations:'myfirst02' }, { center:[120.062824,30.354574], color:'#00e921', animations:'myfirst01' }, { center:[120.063824,30.35974], color:'#fffa02', animations:'myfirst02' }, { center:[120.057824,30.352574], color:'#00e921', animations:'myfirst01' }, { center:[120.056824,30.354574], color:'#fffa02', animations:'myfirst02' }, { center:[120.055824,30.360574], color:'#98014e', animations:'myfirst03' }, { center:[120.071824,30.358574], color:'#98014e', animations:'myfirst03' }, { center:[120.061824,30.358574], color:'#ff7d00', animations:'myfirst04' }, { center:[120.061824,30.358574], color:'#ff7d00', animations:'myfirst04' }, ]
在这里解释一下为什么会有animations这个属性,这是因为我在这里做了两种效果,等一下会一一解释。在这之前我在高德地图上加定位标记都是点标记,通过new AMap.Marker()。但是这个方法只支持对直径,颜色,透明度,边框直径,边框颜色,边框透明度的修改,并没有对点标记样式的修改,当然,你也可以让ui给你设计一款图片,但是图片加载总会耗资源的,最后找了一会发现其实文本标记是可以随意修改样式的,所以最后第一种方法是这样的:
js
for(var i=0;i<capitals.length;i+=1){ var text = new AMap.Text({ text:' ', textAlign:'center', verticalAlign:'middle', //middle 、bottom draggable:true, cursor:'pointer', angle:10, style:{ 'width': '10px', 'height': '10px', 'border-radius': '50%', 'border-width': 0, 'text-align': 'center', 'font-size': '12px', 'color': 'blue', 'background-color':capitals[i].color, // '-moz-box-shadow': '0px 0px 20px 2px '+capitals[i].color, // 'box-shadow': '0px 0px 20px 2px '+capitals[i].color, 'animation': capitals[i].animations+' 1s infinite', // 'animation': 'myfirst 1s infinite' }, position: capitals[i].center }) text.setMap(this.map); }
css
@keyframes myfirst01{ 0% { -moz-box-shadow: 0px 0px 10px 2px #00e921; box-shadow: 0px 0px 10px 2px #00e921; } 50% { -moz-box-shadow: 0px 0px 20px 2px #00e921; box-shadow: 0px 0px 20px 2px #00e921; } 100% { -moz-box-shadow: 0px 0px 10px 2px #00e921; box-shadow: 0px 0px 10px 2px #00e921; } } @keyframes myfirst02{ 0% { -moz-box-shadow: 0px 0px 10px 2px #fffa02; box-shadow: 0px 0px 10px 2px #fffa02; } 50% { -moz-box-shadow: 0px 0px 20px 2px #fffa02; box-shadow: 0px 0px 20px 2px #fffa02; } 100% { -moz-box-shadow: 0px 0px 10px 2px #fffa02; box-shadow: 0px 0px 10px 2px #fffa02; } } @keyframes myfirst03{ 0% { -moz-box-shadow: 0px 0px 10px 2px #98014e; box-shadow: 0px 0px 10px 2px #98014e; } 50% { -moz-box-shadow: 0px 0px 20px 2px #98014e; box-shadow: 0px 0px 20px 2px #98014e; } 100% { -moz-box-shadow: 0px 0px 10px 2px #98014e; box-shadow: 0px 0px 10px 2px #98014e; } } @keyframes myfirst04{ 0% { -moz-box-shadow: 0px 0px 10px 2px #ff7d00; box-shadow: 0px 0px 10px 2px #ff7d00; } 50% { -moz-box-shadow: 0px 0px 20px 2px #ff7d00; box-shadow: 0px 0px 20px 2px #ff7d00; } 100% { -moz-box-shadow: 0px 0px 10px 2px #ff7d00; box-shadow: 0px 0px 10px 2px #ff7d00; } }
这种方法就需要用到animations这个属性,至于为啥会有这么多的动画,是因为我创建的点的颜色不止一种,如果对样式不满意的话可以自己修改,并没有什么很偏僻的样式。
尴尬!!!不知道怎么录屏,反正这种方法的效果就是本体大小不变,外部光圈大小改变。
第二种方法就是:
js
for(var i=0;i<capitals.length;i+=1){ var text = new AMap.Text({ text:' ', textAlign:'center', verticalAlign:'middle', //middle 、bottom draggable:true, cursor:'pointer', angle:10, style:{ 'width': '10px', 'height': '10px', 'border-radius': '50%', 'border-width': 0, 'text-align': 'center', 'font-size': '12px', 'color': 'blue', 'background-color':capitals[i].color, '-moz-box-shadow': '0px 0px 20px 2px '+capitals[i].color, 'box-shadow': '0px 0px 20px 2px '+capitals[i].color, // 'animation': capitals[i].animations+' 1s infinite', 'animation': 'myfirst 1s infinite' }, position: capitals[i].center }) text.setMap(this.map); }
css
@keyframes myfirst{ 0% {transform: scale(1);} 50% {transform: scale(1.5);} 100% {transform: scale(1);} }
这种就是本身大小和光圈大小同时改变。同样,没有例子上传。
ok,打完收工,第一次写这个,感觉还行。就是写的东西没什么技术含量,汗。。。。。。