GoogleMaps SDK for iOS是否支持标记动画?

11

能否使用动画将GMSMarkerGMSMapView上移动/旋转?


从1.2版本开始,它们现在存在了!但我不明白它们是如何工作的/应该如何工作。 - Daij-Djan
某些动画...我想我在兴奋中读错了。 - Daij-Djan
请检查这个链接:http://stackoverflow.com/a/42291262/4831524 - Antony Raphel
4个回答

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

我认为这意味着当标记被放置到地图上时,它将会是动画的 - 而不是你可以制作像原问题所问的高速动画标记。


是的,就像我说的那样 ;) 我确实误读了“文档”。你是正确的。 - Daij-Djan
3
自从v1.5版本,animated字段已更名为appearAnimation - Pang
1
请在此处查看答案 https://dev59.com/TG_Xa4cB1Zd3GeqP0WFs#20179381 - Amozoss

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。
就性能而言,在模拟器中进行动画很慢,但在设备上似乎表现良好。
祝你好运!

1
抱歉,我们无法访问Google Maps所拥有的OpenGL上下文,因此无法实现该功能。最好的办法是将标记旋转为UIImage,但需要重新绘制;或者可以移动标记,但必须以非常小的增量进行,否则会出现跳跃。建议向Google报告此问题,他们可能会解决这个问题。

不幸的是,旋转图像并将新图像分配给GMSMarker也无法正常工作。如果这些图像生成得相对较快(即使不是太快),则标记的行为就会变得奇怪。我看到了“跳跃”到先前状态(图像)或标记消失的情况,而不是显示新图标。UIImage旋转已经检查过了,我确定这是GMSMarker的问题。(当然,我在没有API密钥的情况下进行了测试,这可能是原因)。所以,我可以说,当前版本的Google Maps SDK在iOS上只能用于静态对象。 - Denis
请查看我们刚发布的应用程序,其中包含移动和旋转标记 http://bit.ly/PFinder - Lee Armstrong
看起来不错。但是您更新飞机标记的频率有多高?我猜您将新图像分配给 id<GMSMarker> 的icon属性,对吗? - Denis
他们每秒更新一次位置,但图像更新不那么频繁,但你的方法是正确的。 - Lee Armstrong
@LeeArmstrong,我看了你的应用程序,不知道你介意回答这个问题:这个问题。谢谢。 - s12chung
从1.2版本开始,它们现在存在了!但我不明白它们是如何工作的/应该如何工作。 - Daij-Djan

0

目前标记只有出现动画的选项。

最近为Google Maps SDK for iOS编写了聚类库,具有动画折叠/解体功能。我使用的方法是通过手动位置更新进行动画处理。如果同时在屏幕上有很多标记进行动画处理,那么速度会很慢(即使在后台进行所有可能的计算和结果缓存),因此需要进行大量的优化和限制。因此,现在最好认真考虑是否真的需要像这样使用Google Maps SDK for iOS的动画效果,有时候,特别是在旧设备上,您将不得不完全禁用自定义动画以进行优化。


1
你上面提到的聚类库是否在公共领域中可用?如果是,能否请您分享链接? - tony m
@Tony,抱歉,我是专门为我的公司开发的。 - MANIAK_dobrii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接