在Google地图v2上制作动画标记

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

还有一个很好的演示视频,其中包含了所有这些视频.

http://youtu.be/WKfZsCKSXVQ

旧的弃用答案如下

在文档中,提到标记图标无法更改:

图标

为标记显示的位图.如果未设置图标,则会显示默认图标.您可以使用defaultMarker(float)指定默认图标的替代着色.创建标记后,无法更改图标.

Google Maps API v2文档

您将不得不跟踪特定标记,可能使用与此处描述的方法类似的方法:将标记链接到对象,然后确定需要更新的标记.调用.remove()标记,然后根据所需的"方向"创建旋转图像,使用该图像创建新标记,并将新标记添加到地图中.

您无需"清除"地图,只需删除要修改的标记,创建一个新标记,然后将其添加回地图.

不幸的是,新的Maps API还不是很灵活.希望Google继续改进它.


Mer*_*ury 7

用法示例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)

请享用.


Mac*_*ski 5

从v2的rev.7开始,Marker添加了一个新功能.Marker.setIcon,因此您可以使用多个图标来显示方向.

  • 你有没有试过setIcon的动画?就我而言,有时候眨眼很糟糕(太快或太慢)...... (2认同)