在Android MapView上移动图标

时间:2010-09-25 22:32:16

标签: android google-maps android-mapview itemizedoverlay

我正在开发一个应用程序,用于显示Google MapView上移动项目的位置。我需要一种方法来更新代表项目的图标的位置(以及在更新数据进入时每两秒更改图标的面部)。

我目前在应用中有一个扩展MapActivity的活动。在此我已经覆盖了一个静态叠加层,它在地图上绘制了一些线条,以及一个绘制静态图标的ItemizedOverlay。

有一个draw()方法声称由动画叠加层使用,但是覆盖它来制作我的动画仍然没有做任何动画。

我是否需要告诉应用程序使我的叠加层动画,或者我是否需要使用其他类型的叠加?

4 个答案:

答案 0 :(得分:4)

关于你的问题我有两件事。

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

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

答案 1 :(得分:1)

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

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

2)获得要制作动画的地图标记的位置后 - 将其从地图中移除,然后使用第二个视图开始制作标记移动的动画。在这里,您可以利用专门的Android动画类(即Animation,AnimationUtil,AnimationSet)

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

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

答案 2 :(得分:0)

我仍然对所有这个Android Stuff都很陌生,但是前几天我正在阅读Android Unleashed 2nd ed(配置早期访问程序版本),它涵盖了Animations ......这听起来就像是事情。

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

myItemizedOverlay.startAnimation( anim );

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

我认为你不需要用这种方法搞乱无效。

答案 3 :(得分:0)

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

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

    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);
    }