Android map v2 - 动画标记

标签 android android-mapview android-animation android-maps-v2

我正在为 map (v2) 创建集群功能。我将位置分组到集群中,然后将集群显示为自定义标记:

enter image description here

效果很好,但我想在集群创建和拆分时创建一个动画。我通过在标记(注释)上创建 UIView 动画成功地在 iOS 上做到了这一点。我在网上找不到任何适用于 android 的代码/提示。

我设法获得一个简单的 ImageView 作为叠加层以类似于集群,然后使用 TranslateAnimation 获得所需的动画。最后我删除了这个 View 并添加了标记。

有没有更好的方法来为标记设置动画?

最佳答案

通过为 Marker 对象设置动画而不是在 GoogleMap 前面添加和删除 View ,您走在了正确的轨道上,但是如果您使用 Animator 对象为 Marker 设置动画,您可以获得更好的性能。

通过 Handler 和延迟的 Runnable 方法,您可以有效地对目标帧速率进行硬编码。如果您以太低的延迟发布 Runnable,您的动画将花费更长的时间来执行。如果太高,帧速率会太慢,即使在功能强大的设备上也会显得不稳定。使用 Animator 而不是 Handler 和延迟的 Runnable 的优势在于,它只会调用 onAnimationUpdate() 以在系统可以处理的情况下尽可能频繁地绘制下一帧。

在我的集群库中,Clusterkraf ,我使用了一个 ObjectAnimator(来自 NineOldAndroids 以实现向后兼容性)在更改缩放级别时为群集转换设置动画。它可以流畅地为我的 Galaxy Nexus 上的大约 100 个标记制作动画。

下面是一个 fragment ,其中概述了如何使其发挥作用。

class ClusterTransitionsAnimation implements AnimatorListener, AnimatorUpdateListener {

    private ObjectAnimator animator;
    private AnimatedTransitionState state;
    private ClusterTransitions transitions;
    private Marker[] animatedMarkers;

    void animate(ClusterTransitions transitions) {
        if (this.state == null) {
            Options options = optionsRef.get();
            Host host = hostRef.get();
            if (options != null && host != null) {
                this.state = new AnimatedTransitionState(transitions.animated);
                this.transitions = transitions;
                animator = ObjectAnimator.ofFloat(this.state, "value", 0f, 1f);
                animator.addListener(this);
                animator.addUpdateListener(this);
                animator.setDuration(options.getTransitionDuration());
                animator.setInterpolator(options.getTransitionInterpolator());
                host.onClusterTransitionStarting();
                animator.start();
            }
        }
    }

    @Override
        public void onAnimationStart(Animator animator) {
            // Add animatedMarkers to map, omitted for brevity
        }

    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        if (state != null && animatedMarkers != null) {
            LatLng[] positions = state.getPositions();
            for (int i = 0; i < animatedMarkers.length; i++) {
                animatedMarkers[i].setPosition(positions[i]);
            }
        }
    }
}

关于Android map v2 - 动画标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14645489/

相关文章:

android - map View 上 isRouteDisplayed() 的后果

android - 每次请求位置更新时都应该使用 android LocationManager.getBestProvider 吗?

android - API 低于 16 的 addOnDrawListener 替代方案

java - Signal R native Android 应用程序协商失败

java - 在 Android 中,一个应用程序在较低 API 级别出现编译错误的情况下是否可以顺利运行?

java - Espresso 单元测试 : How to disable animation in code

android - 如何将对话框窗口背景设置为透明,而不影响其边距

android - 注入(inject)触摸屏事件,Android 5.0,dev/input/eventX

android - MapView 在 Android mvvm 数据绑定(bind)中不显示谷歌地图 [已解决]

java - Android属性动画: how to increase view height?