GoogleMaps SDK for iOS上是否存在标记动画?

时间:2013-01-19 13:18:03

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

是否可以使用动画在GMSMarker上移动/旋转GMSMapView

4 个答案:

答案 0 :(得分:6)

1.2中的添加是GMSMarker类具有animated属性 - 我假设您只是将其设置为YES,然后通过设置将{{}添加到地图中map 1}}属性(虽然我没试过)。

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_;

我认为这意味着标记在放到地图上时会被动画化 - 而不是像原始问题那样制作高速动画标记。

答案 1 :(得分:1)

不,我担心他们不会,因为我们无法访问Google地图可以访问的OpenGL上下文。您可以做的最好的事情是将标记旋转为需要重绘的UIImage,或者您可以移动标记,但除非您以非常小的增量进行标记,否则它会跳转!

我建议向Google报告错误,他们可以将其包含在内

答案 2 :(得分:1)

我的解决方案是继承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。

在性能方面,在模拟器中制作动画效果非常慢,但在设备上效果非常好。

祝你好运!

答案 3 :(得分:0)

现在标记只有一个显示动画的选项。

最近为带有动画崩溃/分解的Google Maps SDK for iOS编写了群集库。我使用的方法是通过手动位置更新动画。如果屏幕上有很多标记同时为它设置动画(即使在背景和结果缓存中进行了所有可能的计算),也需要大量的优化和限制。因此,如果您真的需要使用谷歌地图SDK for iOS或类似动画,或者有时,特别是在较旧的设备上,您必须使用的优化将完全禁用您的自定义动画,这是很好的想法。