【问题标题】:Slow down google panTo function减慢谷歌 panTo 功能
【发布时间】:2012-02-17 20:45:13
【问题描述】:

我有一张地图,当标记被放置在地图上时,它会在地图上从一个点平移到另一个点。我遇到的问题是平移太快了。有什么办法可以减慢 panTo 功能?

谢谢, 克里斯

【问题讨论】:

    标签: google-maps google-maps-api-3


    【解决方案1】:

    很遗憾,不,您无法更改 panTo 动画的速度。

    该函数只接受一个 latlng 参数。详情在这里:http://code.google.com/apis/maps/documentation/javascript/reference.html#Map

    【讨论】:

      【解决方案2】:

      我编写了自己的 panTo 实现。使用“EasingAnimator”类。

      var EasingAnimator = function(opt){
              opt = opt || {};
              this.easingInterval = opt.easingInterval;
              this.duration = opt.duration || 1000;
              this.step = opt.step || 50;
              this.easingFn = opt.easingFn  || function easeInOutElastic(t, b, c, d) {
                  if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
                  return -c/2 * ((t-=2)*t*t*t - 2) + b;
              };
              this.callBack = opt.callBack || function(){};
          };
      EasingAnimator.makeFromCallback = function(callBack){
          return new EasingAnimator({
              callBack: callBack
          });
      };
      EasingAnimator.prototype.easeProp = function(obj, propDict){
          propDict = propDict || {};
      
          var self = this,
              t = 0,
              out_vals = JSON.parse(JSON.stringify(obj));
      
          clearInterval(self.easingInterval);
          self.easingInterval = setInterval(function(){
              t+= self.step;
              if (t >= self.duration) {
                  clearInterval(self.easingInterval);
                  self.callBack(propDict);
                  return;
              }
              var percent = self.easingFn(t, 0, 1, self.duration);
              Object.keys(propDict).forEach(function(key, i) {
                  var old_val = obj[key];
      
                  out_vals[key] = old_val - percent*(old_val - propDict[key]);
              });
              self.callBack(out_vals);
          }, self.step);
      };
      

      现在您可以控制一切,包括持续时间、步数,当然还有缓动功能。这里有一些很好的例子http://easings.net/。现在你可以像这样使用它了:

      dom_elem.addEventListener('click', function(event){
          var point = map.getCenter();
      
          easingAnimator.easeProp({
              lat: point.lat(),
              lng: point.lng()
          }, points[i]);
      });
      

      在这里您可以找到其工作原理的现场演示 http://codepen.io/ErDmKo/pen/Jdpmzv

      【讨论】:

      • 不幸的是,标记有时(经常)会消失。一张地图的微动似乎太多了
      • 这在我的情况下非常有效,我的大部分标记已经在屏幕上可见。我已经调整了 codepen 示例。谢谢@ErDmKo!
      【解决方案3】:

      我编写了一个函数来使用 Google Maps API v3 实现“慢速平移”。它使用小平移步骤以及先前的答案,尽管我认为实现更简单一些。您可以为 f_timeout() 使用缓动函数。

      参数

      地图:您的 google.maps.Map 对象

      endPosition:希望平移到的位置,google.maps.LatLng

      n_intervals:平移间隔数,越多过渡越平滑但性能越差

      T_msec:慢平移完成的总时间间隔(毫秒)

      var slowPanTo = function(map, endPosition, n_intervals, T_msec) {
        var f_timeout, getStep, i, j, lat_array, lat_delta, lat_step, lng_array, lng_delta, lng_step, pan, ref, startPosition;
        getStep = function(delta) {
          return parseFloat(delta) / n_intervals;
        };
        startPosition = map.getCenter();
        lat_delta = endPosition.lat() - startPosition.lat();
        lng_delta = endPosition.lng() - startPosition.lng();
        lat_step = getStep(lat_delta);
        lng_step = getStep(lng_delta);
        lat_array = [];
        lng_array = [];
        for (i = j = 1, ref = n_intervals; j <= ref; i = j += +1) {
          lat_array.push(map.getCenter().lat() + i * lat_step);
          lng_array.push(map.getCenter().lng() + i * lng_step);
        }
        f_timeout = function(i, i_min, i_max) {
          return parseFloat(T_msec) / n_intervals;
        };
        pan = function(i) {
          if (i < lat_array.length) {
            return setTimeout(function() {
              map.panTo(new google.maps.LatLng({
                lat: lat_array[i],
                lng: lng_array[i]
              }));
              return pan(i + 1);
            }, f_timeout(i, 0, lat_array.length - 1));
          }
        };
        return pan(0);
      };
      

      【讨论】:

      • 比我在搞乱地图 api 时想出的任何东西都要好得多。感谢您分享您的解决方案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多