【问题标题】:Do marker animations exist on GoogleMaps SDK for iOS?GoogleMaps SDK for iOS 上是否存在标记动画?
【发布时间】:2013-01-19 13:18:03
【问题描述】:

是否可以通过动画在GMSMapView 上移动/旋转GMSMarker

【问题讨论】:

  • 它们现在存在!从 1.2 开始,但我看不出它们是如何工作的/应该如何工作
  • 一些动画.. 我想我在兴奋中读错了
  • 工作并检查这个:stackoverflow.com/a/42291262/4831524

标签: ios google-maps google-maps-sdk-ios


【解决方案1】:

在 1.2 中添加的是 GMSMarker 类有一个 animated 属性 - 我假设您只是将其设置为 YES,然后通过设置其 map 属性将标记添加到地图(我没有不过没试过)。

https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_marker

GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086);
marker.title = @"Sydney";
marker.snippet = @"Australia";
marker.animated = YES;
marker.map = mapView_;

我认为这意味着当标记被放到地图上时,它会被动画化 - 并不是说​​你可以像这个原始问题所问的那样制作高速动画标记。

【讨论】:

【解决方案2】:

不,恐怕它们不是,因为我们无法访问 Google 地图可以访问的 OpenGL 上下文。您可以做的最好的是将标记旋转为需要重绘的 UIImage,或者您可以移动标记但它会跳跃,除非您以非常小的增量执行此操作!

我建议向Google 报告错误,他们可能会包含它

【讨论】:

  • 不幸的是,旋转图像并将新图像分配给 GMSMarker 也无法正常工作。如果此类图像生成相对较快(甚至不是太快),则标记的行为很奇怪。我看到“跳转”到以前的状态(图像),或者标记消失,而不是显示新图标。检查了 UIImage 旋转,我确定这是 GMSMarker 的问题。 (我在没有API Key的情况下测试过,当然也可以是这个原因)。所以,我只能说,iOS 上当前版本的 Google Maps SDK 只能用于静态对象。
  • 查看我们刚刚发布的带有移动和旋转标记的应用bit.ly/PFinder
  • 看起来不错。但是您多久更新一次平面标记?您将新图像分配给 id 图标属性是否正确?
  • 他们每秒更新一次位置,而且图像不那么频繁,但你的方法是正确的。
  • @LeeArmstrong,我看了你的应用,你介意回答:this question。谢谢。
【解决方案3】:

我的解决方案是继承 GMSMarker 类并使用计时器添加对 PNG 序列的支持。这是代码的粗略草图:

.h:

#import <GoogleMaps/GoogleMaps.h>

@interface AnimatedGMSMarker : GMSMarker

@property (nonatomic, strong) NSString *animationBaseName;

-(void)setAnimation:(NSString *)name forFrames:(NSArray *)frames;

@end

.m

#import "AnimatedGMSMarker.h"

@implementation AnimatedGMSMarker{
    int _currentFrame;
    NSArray *_frameArray;
    NSTimer *_timer;
}

-(void)setAnimation:(NSString *)name forFrames:(NSArray *)frames{
    _frameArray = frames;
    _currentFrame = 0;
    _animationBaseName = name;
    self.icon = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@",_animationBaseName,_frameArray[_currentFrame++]]];
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0/24.0f
                                                     target:self
                                                   selector:@selector(onRefreshTimer:)
                                                   userInfo:nil
                                                    repeats:YES];
}

-(void)onRefreshTimer:(NSTimer *)timer{
    self.icon = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@",_animationBaseName,_frameArray[_currentFrame++]]];
    if (_currentFrame >= _frameArray.count){
        _currentFrame = 0;
    }
}

@end

然后一旦你实例化一个,只需发送如下内容:

[self.myAnimatedMarker setAnimation:@"some_library_name" forFrames:@[@0,@1,@2,@3,@4,@5,@6,@7,@8,@9]];

并确保您的库有一堆相同大小和注册的 PNG,命名为“some_library_name0”、“some_library_name1”等。帧数组处理允许您重复帧而不创建新的 PNG。

在性能方面,在模拟器中制作动画非常慢,但在设备上看起来相当不错。

祝你好运!

【讨论】:

    【解决方案4】:

    目前标记只有一个选项可以显示为动画。

    最近为 iOS 版 Google Maps SDK 编写了集群化库,带有动画折叠/分解。我使用的方法是通过手动位置更新动画。如果屏幕上有很多标记同时进行动画处理,它会很慢(即使在后台和结果缓存中进行了所有可能的计算),因此需要很多优化和限制。因此,如果您真的需要使用适用于 iOS 的 Google Maps SDK 或有时(尤其是在较旧的设备上)使用类似的动画,那么现在最好多考虑一下,您必须使用的优化将完全禁用您的自定义动画。

    【讨论】:

    • 您上面提到的集群化库是否在公共领域可用?如果可以的话,可以分享一下链接吗
    • @tony,对不起,我专门为我的公司开发的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多