GMSMarker
是否可以通过GMSMapView
动画移动/旋转?
4 回答
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_;
我认为这意味着当它被放到地图上时标记将被动画 - 并不是说你可以像这个原始问题那样制作一个高速动画标记。
不,我担心它们不是因为我们无法访问谷歌地图可以访问的 OpenGL 上下文。您可以做的最好的事情是将标记旋转为需要重绘的 UIImage,或者您可以移动标记,但除非您以非常小的增量执行此操作,否则它会跳跃!
我建议向Google报告错误,他们可能会包含它
我的解决方案是继承 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。
性能方面,在模拟器中制作动画非常慢,但在设备上看起来相当不错。
祝你好运!
目前,标记只有一个选项可以显示为动画。
最近为 iOS 版 Google Maps SDK 编写了集群化库,带有动画折叠/分解。我使用的方法是通过手动位置更新动画。如果屏幕上有很多标记同时进行动画处理,它会很慢(即使所有可能的计算都在后台和结果缓存中),所以需要很多优化和限制。因此,如果您真的需要使用适用于 iOS 的 Google Maps SDK 或有时,特别是在旧设备上,您必须使用的优化将完全禁用您的自定义动画,那么现在最好多考虑一下。