前言
以百度地图为例, 其他地图思路大致相同. 出现闪烁问题更多的是用法可能有问题. 应避免清除地图视图再创建. 此问题是之前优化地图项目时的一个小问题, 特此记录.
不推荐的思路
使用addOverlay和removeOverlay, 先清除图层,然后重新创建图层进行播放
优化方法
使用创建后的图层对象方法 setImageURL() 直接更换图片地址
每次更换图片使用setImageURL(), 而不是清除图层,再重新创建图层.
实践方法
使用百度地图示例中心: lbsyun.baidu.com/jsdemo3.0.h…
对照百度地图的示例运行较为直观. 将下方代码贴入编辑器中运行播放即可看到效果.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
body,
html {
width: 100%;
height: 100%;
margin: 0;
font-family: "微软雅黑";
}
#allmap {
height: 500px;
width: 100%;
}
#r-result {
width: 100%;
}
</style>
<script
type="text/javascript"
src="//api.map.baidu.com/api?v=3.0&ak=您的密钥"
></script>
<title>添加/删除地面叠加层</title>
</head>
<body>
<div id="allmap"></div>
<div id="r-result">
<input type="button" onclick="addGroundOverlay();" value="添加" />
<input type="button" onclick="removeGroundOverlay();" value="删除" />
<input type="button" onclick="play();" value="播放" />
<input type="button" onclick="stop();" value="停止" />
</div>
</body>
</html>
<script type="text/javascript">
var TianAnMen = new BMap.Point(116.404449, 39.914889);
// 创建Map实例
var map = new BMap.Map("allmap");
// 居中放大
map.centerAndZoom(TianAnMen, 12);
// 启用滚轮放大缩小
map.enableScrollWheelZoom();
// 西南角和东北角
var SW = new BMap.Point(116.29579, 39.837146);
var NE = new BMap.Point(116.475451, 39.9764);
groundOverlayOptions = {
opacity: 1,
displayOnMinLevel: 10,
displayOnMaxLevel: 14,
};
// 初始化GroundOverlay
var groundOverlay = new BMap.GroundOverlay(
new BMap.Bounds(SW, NE),
groundOverlayOptions
);
const imageArr = [
"https://apisv0.bdimg.com/?qt=pdata&sid=09002200121902241041383757N&pos=1_7&z=4&from=JSAPI&auth_key=1645423087-0-0-bcd6ed03c7f516d8ac6d1881528423c8",
"https://apisv1.bdimg.com/?qt=pdata&sid=09002200121902241041383757N&pos=1_0&z=4&from=JSAPI&auth_key=1645423087-0-0-bcd6ed03c7f516d8ac6d1881528423c8",
"https://apisv1.bdimg.com/?qt=pdata&sid=09002200121902241041383757N&pos=2_7&z=4&from=JSAPI&auth_key=1645423087-0-0-bcd6ed03c7f516d8ac6d1881528423c8",
"https://apisv1.bdimg.com/?qt=pdata&sid=09002200121902241041383757N&pos=2_1&z=4&from=JSAPI&auth_key=1645423087-0-0-bcd6ed03c7f516d8ac6d1881528423c8",
];
// 设置GroundOverlay的图片地址
groundOverlay.setImageURL('/jsdemo/img/si-huan.png');
// 单击事件
groundOverlay.addEventListener("click", function (clickEvent) {
// console.log('clickEvent', clickEvent);
});
// 双击事件
groundOverlay.addEventListener("dblclick", function (dblclickEvent) {
// console.log('dblclickEvent', dblclickEvent);
});
function addGroundOverlay() {
// 添加GroundOverlay
map.addOverlay(groundOverlay);
}
function removeGroundOverlay() {
// 移除GroundOverlay
map.removeOverlay(groundOverlay);
}
var playInterval = null;
function play() {
playInterval = setInterval(() => {
removeGroundOverlay();
addGroundOverlay();
// 将上方两行方法注释, 打开下方注释行即可看到不闪烁的效果.
// groundOverlay.setImageURL(imageArr[Math.floor(Math.random() * imageArr.length)])
}, 1000);
}
function stop() {
clearInterval(playInterval);
}
</script>