百度地图播放图片时避免闪烁的用法

603 阅读1分钟

前言

以百度地图为例, 其他地图思路大致相同. 出现闪烁问题更多的是用法可能有问题. 应避免清除地图视图再创建. 此问题是之前优化地图项目时的一个小问题, 特此记录.

不推荐的思路

使用addOverlayremoveOverlay, 先清除图层,然后重新创建图层进行播放

优化方法

使用创建后的图层对象方法 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>