【问题标题】:Can I animate scale marker in GoogleMaps SDK for iOS?我可以在适用于 iOS 的 GoogleMaps SDK 中为比例标记设置动画吗?
【发布时间】:2015-10-22 19:22:49
【问题描述】:

参考Do marker animations exist on GoogleMaps SDK for iOS?Google Dev Guide 我知道我只能在标记出现时使用appearAnimation 设置动画,并通过GMSMarkerLayer 设置不透明度的动画

因为GMSMarkerLayer.iconUIImage。我可以像一个名为Find My Friends 的应用程序一样设置缩放GMSMarker 图标的动画吗? (当点击标记时,它会动画缩放或放大标记图标)

谢谢。

【问题讨论】:

    标签: ios google-maps-sdk-ios


    【解决方案1】:

    您可以通过更改分配给它的 ui 图像来缩放 gmsMarker 图标。

    理想情况下,您应该从 ui 线程(在 sn-p 中通过另一个线程完成)回调动画函数以防止闪烁。

    这里有一个示例代码 sn-p 来测试这个概念:

    BOOL runInflateAnimation=YES;
    float curScaleFactor=1.0f;
    float curScaleDirection=-1.0f;
    float scaleStep=0.2f;
    float scaleMin=0.5f;
    float scaleMax=2.0f;
    
    double lastTimeStamp;
    -(void) startBouncyAnimation
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,(unsigned   long)NULL), ^(void)
                   {
                       while (runBouncyAnimation)
                       {
    
                           double curTimeStamp =[[NSDate date] timeIntervalSince1970];
                           double delta;
                           if (lastTimeStamp>0)
                           {
                               delta = curTimeStamp - lastTimeStamp;
                               curScaleFactor+=scaleStep*curScaleDirection * delta;
                               if (curScaleFactor<scaleMin)
                               {
                                   curScaleFactor=scaleMin;
                                   curScaleDirection*=-1.0f;
                               } else if (curScaleFactor>scaleMax)
                               {
                                   curScaleFactor=scaleMax;
                                   curScaleDirection*=-1.0f;
                               }
                               [self hackAnimation];
    
                           }
                           lastTimeStamp =curTimeStamp;
                           [NSThread sleepForTimeInterval:0.1f];
                       }
    
                   }
                   );
    }
    
    
    -(void) hackAnimation
    {
        if (![NSThread isMainThread])
        {
            [self performSelectorOnMainThread:@selector(hackAnimation) withObject:nil waitUntilDone:NO];
        }
    @synchronized(currentLocationMarker)
    {
    GMSMarker* theMarker = currentLocationMarker;
    UIImage* curImage = [UIImage imageNamed:@"myMarker.png"];
    UIImage* scaled = [UIImage imageWithData:UIImagePNGRepresentation(curImage) scale:curScaleFactor];
    theMarker.icon=scaled;
    }
    
    }
    

    【讨论】:

      【解决方案2】:

      如果您希望标记被点击后的增长动画而不是有弹性的动画,请像这样初始化您的标记图像:

      kStartingImageScale = 3.0 // make it available in your class.
      
      marker.icon = UIImage(data: UIImagePNGRepresentation(UIImage(named: "marker")!)!, scale: CGFloat(kStartingImageScale))!
      

      然后使用@MichaelCMS稍微修改的方法

      func startAnimation(shouldGrow:Bool) {
      
          let scaleMin:Double = 2.0;
          let scaleMax:Double = kStartingImageScale;
          var curScaleFactor:Double = shouldGrow ? scaleMax: scaleMin;
          var curScaleDirection:Double = 1.0;
          let scaleStep:Double = 4.0;
      
          let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
          dispatch_async(dispatch_get_global_queue(priority, 0)) {
      
              var runAnimation: Bool = true
      
              var lastTimeStamp:Double?
      
              while (runAnimation)
              {
      
                  let curTimeStamp:Double = NSDate().timeIntervalSince1970
                  var delta:Double;
                  if (lastTimeStamp>0)
                  {
                      delta = curTimeStamp - lastTimeStamp!;
                      curScaleFactor+=scaleStep*curScaleDirection*delta;
                      if (curScaleFactor < scaleMin)
                      {
                          curScaleFactor = scaleMin;
                          curScaleDirection = curScaleDirection*(-1.0);
      
                          runAnimation = !shouldGrow
      
                      }
                      else if (curScaleFactor>scaleMax)
                      {
                          curScaleFactor = scaleMax;
                          curScaleDirection = curScaleDirection*(-1.0);
      
                          runAnimation = shouldGrow
      
                      }
                      self.hackAnimation(curScaleFactor)
      
                  }
      
                  lastTimeStamp = curTimeStamp;
                  NSThread.sleepForTimeInterval(0.01)
              }
          }
      }
      
      func hackAnimation(curScaleFactor:Double)
      {
          let theMarker:GMSMarker = self.marker!;
          let curImage:UIImage = UIImage(named: "marker")!
          let scaled:UIImage  = UIImage(data: UIImagePNGRepresentation(curImage)!, scale: CGFloat(curScaleFactor))!
      
          dispatch_async(dispatch_get_main_queue(), { () -> Void in
              theMarker.icon=scaled;
          })
      }
      
      // MARK: - GMSMapViewDelegate
      
      var grooow:Bool = true;
      
      func mapView(mapView: GMSMapView!, didTapMarker marker: GMSMarker!) -> Bool {
      
          DDLogDebug("Marker tapped \(marker)")
          startAnimation(grooow)
          grooow = !grooow
      
          return true
      }
      

      【讨论】:

      • 你能在对象c中提供你的解决方案吗
      • @ZakariaDarwish 看看 MichaelCMS 的回答
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2014-01-02
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2013-02-09
      • 2018-10-31
      相关资源
      最近更新 更多