Mak*_*kin 32 android google-maps google-maps-mobile google-maps-android-api-2
使用v2 API在Google地图上制作标记的最佳方法是什么?
我正在开发一个以地图为中心的游戏,我在这里跟踪人物的位置并在地图上显示它们以供彼此查看.随着人们的移动,我想要将一个标记从他当前的动态设置为最新的位置.每个人都有方向,所以我需要适当地旋转标记.
使用新版Google Maps API的最佳方法是什么?
Dis*_*Dev 60
对于所有不同版本的Android,一些Google工程师提供了一个很棒的演示视频,其中包含一些关于如何为起点到终点设置标记动画的优雅示例代码:
相关代码在这里:
https://gist.github.com/broady/6314689
还有一个很好的演示视频,其中包含了所有这些视频.
旧的弃用答案如下
在文档中,提到标记图标无法更改:
图标
为标记显示的位图.如果未设置图标,则会显示默认图标.您可以使用defaultMarker(float)指定默认图标的替代着色.创建标记后,无法更改图标.
您将不得不跟踪特定标记,可能使用与此处描述的方法类似的方法:将标记链接到对象,然后确定需要更新的标记.调用.remove()标记,然后根据所需的"方向"创建旋转图像,使用该图像创建新标记,并将新标记添加到地图中.
您无需"清除"地图,只需删除要修改的标记,创建一个新标记,然后将其添加回地图.
不幸的是,新的Maps API还不是很灵活.希望Google继续改进它.
用法示例为DiscDev的答案(上图):
LatLng fromLocation = new LatLng(38.5, -100.4); // Whatever origin coordinates
LatLng toLocation = new LatLng(37.7, -107.7); // Whatever destination coordinates
Marker marker = mMap.addMarker(new MarkerOptions().position(firstLocation));
MarkerAnimation.animateMarkerToICS(marker, toLocation, new LatLngInterpolator.Spherical());
Run Code Online (Sandbox Code Playgroud)
对于那些使用GPS /或任何接收位置更新的位置提供商的人:
Marker ourGlobalMarker;
// We've got a location from some provider of ours, now we can call:
private void updateMarkerPosition(Location newLocation) {
LatLng newLatLng = new LatLng(newLocation.getLatitude(), newLocation.getLongitude());
if(ourGlobalMarker == null) { // First time adding marker to map
ourGlobalMarker = mMap.addMarker(new MarkerOptions().position(newLatLng));
}
else {
MarkerAnimation.animateMarkerToICS(ourGlobalMarker, newLatLng, new LatLngInterpolator.Spherical());
}
}
Run Code Online (Sandbox Code Playgroud)
重要:
在1MarkerAnimation.java如果动画持续时间设置为X,并且是在较小的则X的速度接收位置更新,多个动画将被触发,你可能会看到标记动画闪烁了一下(这是不是一个很好的用户体验).
为了避免这种情况,该animationMarkerToICS方法(我在这里animationMarkerToICS举例说明)应该看起来像这样,
完整方法实现:
private static Animator animator; // MAKING ANIMATOR GLOBAL INSTEAD OF LOCAL TO THE STATIC FUNCTION
...
// Ice Cream Sandwich compatible
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static void animateMarkerToICS(Marker marker, LatLng finalPosition, final LatLngInterpolator latLngInterpolator) {
TypeEvaluator<LatLng> typeEvaluator = new TypeEvaluator<LatLng>() {
@Override
public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) {
return latLngInterpolator.interpolate(fraction, startValue, endValue);
}
};
Property<Marker, LatLng> property = Property.of(Marker.class, LatLng.class, "position");
// ADD THIS TO STOP ANIMATION IF ALREADY ANIMATING TO AN OBSOLETE LOCATION
if(animator != null && animator.isRunning()) {
animator.cancel();
animator = null;
}
animator = ObjectAnimator.ofObject(marker, property, typeEvaluator, finalPosition);
animator.setDuration((long) ANIMATION_DURATION);
animator.start();
}
Run Code Online (Sandbox Code Playgroud)
请享用.
从v2的rev.7开始,Marker添加了一个新功能.Marker.setIcon,因此您可以使用多个图标来显示方向.
| 归档时间: |
|
| 查看次数: |
54774 次 |
| 最近记录: |