【问题标题】:Is it possible to assign an animate svg to a marker symbol in google Maps JavaScript API?是否可以将动画 svg 分配给 google Maps JavaScript API 中的标记符号?
【发布时间】:2017-08-03 10:33:13
【问题描述】:

我使用 SVG 创建了一个符号。这是我的标志:

    var symbol = {
    anchor: new google.maps.Point(11, 11),
    url: 'data: image/svg+xml;utf-8, ' + mysvg,
    size : new google.maps.Size(22, 22)
}

我已经将它分配给一个标记:

marker.setIcon(symbol);

我的 svg 如下:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 
<g fill="none" stroke-width="3" transform="translate(11,11)">
<circle id="my-circle" cx="0" cy="0" r="9" stroke="darkorange" fill="seagreen" />
 </g> </svg>

效果很好,但在某些情况下我需要为标记设置动画,因此我创建了以下动画 svg 以将其分配给我的标记:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 
<g fill="none" stroke-width="3" transform="translate(11,11)">
<circle id="my-circle" cx="0" cy="0" r="9" stroke="darkorange" fill="seagreen" />
<animate href="#my-circle" attributeName="opacity"  values="1;-2" dur="1s" repeatCount="indefinite" /> </g> </svg>

并且我已经以与之前相同的方式创建了一个新符号:

var animatedsymbol = {
    anchor: new google.maps.Point(11, 11),
    url: 'data: image/svg+xml;utf-8, ' + myanimatesvg,
    size : new google.maps.Size(22, 22)
}

我将它分配给标记:

marker.setIcon(animatedsymbol);

但它不起作用,标记没有显示。我怀疑谷歌地图 api 标记不支持这种动画 svg。有谁知道它是否支持动画 svgs?如果是这样,你有什么暗示我做错了吗?

提前谢谢你。

【问题讨论】:

    标签: javascript google-maps animation svg google-maps-api-3


    【解决方案1】:

    我认为这样做没有问题。检查此代码:

    var svgNonAnimated = btoa([
      '<?xml version="1.0"?>',
      '<svg viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">',
      '<g fill="none" stroke-width="3" transform="translate(11,11)">',
      '<circle id="my-circle" cx="0" cy="0" r="9" stroke="darkorange" fill="seagreen" />',
      '</g></svg>'
    ].join('\n'));
    
    var svgAnimated = btoa([
      '<?xml version="1.0"?>',
      '<svg viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">',
      '<g fill="none" stroke-width="3" transform="translate(11,11)">',
      '<circle id="my-circle" cx="0" cy="0" r="9" stroke="darkorange" fill="seagreen" />',
      '<animate href="#my-circle" attributeName="opacity"  values="1;-2" dur="1s" repeatCount="indefinite" />',
      '</g></svg>'
    ].join('\n'));
    
    
    function initMap() {
      var center = new google.maps.LatLng(33.53625, -111.92674);
    
      var map = new google.maps.Map(document.getElementById('map'), {
        center: center,
        zoom: 13
      });
    
      var marker = new google.maps.Marker({
        position: center,
        map: map,
        title: 'Dynamic SVG Marker',
        icon: getIcon(false),
        optimized: false
      });
    
      var isAnimated = false;
      document.getElementById('toggleAnimation').addEventListener('click', function() {
        isAnimated = !isAnimated;
        marker.setIcon(getIcon(isAnimated));
      });
    
      function getIcon(animated) {
        return animated ? {
          url: 'data:image/svg+xml;charset=UTF-8;base64,' + svgAnimated,
          scaledSize: new google.maps.Size(50, 50)
        } : {
          url: 'data:image/svg+xml;charset=UTF-8;base64,' + svgNonAnimated,
          scaledSize: new google.maps.Size(50, 50)
        };
      }
    
    }
    .as-console-wrapper{
      display:none !important;
    }
    <script async defer type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false&callback=initMap"></script>
    
    <div id="map" style="width:400px;height:150px;float:left"></div>
    <button id="toggleAnimation" style="float: left;width: 70px;text-align: center;font-size: 11px;">Toggle Animate</button>

    这适用于 Chrome 和 Firefox,但在 IE11 中我只看到没有动画的 svg ...

    【讨论】:

    • 谢谢。您的代码运行良好,所以现在我知道这样做没有问题。它在我的代码中仍然不起作用,但我在你的答案中有很好的提示,所以我想我会设法应用它。再次感谢您。
    • @LaiaLinaresOrtells 这听起来很棒。很高兴我的回答能帮到你。请注意,此代码适用于 IE11(需要解决)
    猜你喜欢
    • 2016-11-19
    • 2011-12-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2021-05-26
    • 2013-04-25
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多