11

我正在开发一个在 Google MapView 上显示移动项目位置的应用程序。我需要一种方法来更新代表项目的图标的位置(以及随着更新数据的到来每两秒更改一次图标的朝向)。

我目前在应用程序中有一个扩展 MapActivity 的活动。为此,我覆盖了一个在地图上绘制一些线条的静态 Overlay 和一个绘制静态图标的 ItemizedOverlay。

有一个 draw() 方法声称被动画覆盖使用,但是重写它来做我的动画仍然不会使任何动画。

我需要告诉应用程序让我的叠加层动画化,还是需要使用不同类型的叠加层?

4

4 回答 4

4

关于您的问题,我想到了两件事。

首先,您是否考虑过在 MapView 上使用invalidate()来强制重绘?这可能不是最有效的解决方案,但它至少应该为您提供可以工作的东西。

其次,您可以通过再次调用活动来刷新地图上的项目。这是一个例子

于 2010-10-02T16:49:45.293 回答
1

使用 MapView 和 Overlays 的内置功能来绘制动画可能会影响您的性能。我的建议是:

1) 将 MapView 与另一个 View 结合起来。MapView 将为您提供必要的屏幕坐标,另一个视图将用作动画的画布。两个视图应该占据相同的屏幕位置(使用框架布局);

2) 一旦你得到你想要动画的地图标记的位置 - 从地图中删除它并开始使用第二个视图对标记的移动进行动画处理。在这里,您可以利用专门的 android 动画类(即 Animation、AnimationUtil、AnimationSet)

3) 完成动画后 - 将标记添加到地图视图叠加层,现在位于其新位置并使叠加层无效

也许可以有更优化的方法(即直接在 MapView 画布上使用动画),但最重要的是 - 您应该使用专门的动画机制来防止性能问题。

于 2010-10-27T16:57:21.593 回答
0

我对所有这些 Android Stuff 还是很陌生,但前几天我正在阅读 Android Unleashed 2nd ed(配备早期访问程序版本),其中涵盖了动画……听起来就是这样。

Animation anim = new TranslateAnimation( startX, stopX, startY, stopY );
anim.setDuration( 2000 /* 2 seconds */ );
anim.init( overlayWid, overlayHei, parentWid, parentHei )

myItemizedOverlay.startAnimation( anim );

请注意,我实际上并没有尝试过任何类似的东西,但这就是书/JavaDoc 让我相信会起作用的东西。您可能需要在 startAnimation() 之前调用。就像我说的......几乎不是我的专业领域(还没有!)。

我认为您根本不需要使用这种方法来处理无效问题。

于 2010-10-20T23:57:40.283 回答
0

作为显示动画的选项,您可以使用 MapView 类的 addView 方法。它很简单:

  1. 只需创建一个视图(如 ImageView 或任何其他视图);
  2. 初始化视图布局,创建 MapView.LayoutParams 并将其传递给 setLayoutParams 方法;
  3. 将视图添加到 MapView。

滚动地图时视图会自动移动。

public static void addAnimationToMap(MapView map, int animationResourceId, GeoPoint geoPoint) {

    final ImageView view = new ImageView(map.getContext());
    view.setImageResource(animationResourceId);

    //Post to start animation because it doesn't start if start() method is called in activity OnCreate method.
    view.post(new Runnable() {
        @Override
        public void run() {
            AnimationDrawable animationDrawable = (AnimationDrawable) view.getDrawable();
            animationDrawable.start();
        }
    });

    map.addView(view);

    MapView.LayoutParams layoutParams = new MapView.LayoutParams(
            MapView.LayoutParams.WRAP_CONTENT,
            MapView.LayoutParams.WRAP_CONTENT,
            geoPoint,
            MapView.LayoutParams.BOTTOM_CENTER);
    view.setLayoutParams(layoutParams);
}
于 2011-10-05T21:07:34.817 回答