在Android MapView上移动图标

问题描述:

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

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

有一个draw()方法声称被动画叠加使用,但是覆盖它来完成我的动画仍然不会生成任何动画。

我是否需要告诉应用使我的覆盖层变成动画,还是我需要使用不同类型的覆盖层?

对于您的问题,我有两件事情需要考虑。

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

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

+0

我已经考虑过无效选项。从我读过的内容来看,这可能会影响表现,但我会试试看。我想知道的是:为了平滑地将图标从一个地方移动到另一个地方,我该如何使覆盖无效〜每秒20次? – Hober 2010-10-04 15:04:02

+1

也许你应该考虑使用一个计时器线程,看看这个http://www.anddev.org/viewtopic.php?t=126 – 2010-10-04 17:28:29

+0

我结束了使用一个普通的查看和postTime从TimerThread验证它给我的更新。碰巧,我不希望地图重新绘制每一帧,只是这个其他视图上的移动对象,所以我正在寻找使用绘图缓存来保存MapView。也就是说,你对计时器线程的回答是非常正确的。它可以让您每秒刷新固定次数,因此您可以保证良好的帧率而不显示每个可能的帧。 – Hober 2010-10-29 23:59:12

我对这个Android的东西还是很新的,但是我前几天读的是Android Unleashed 2nd ed(manning early access program),它包含了动画......这听起来就像是一个东西。

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

myItemizedOverlay.startAnimation(anim); 

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

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

+0

我相信你不能在ItemizedOverlays上使用动画。 – Tom 2011-11-21 17:02:03

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

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

2)一旦你得到了地图标记的位置,你想要动画 - 从地图中删除它,并开始使用第二个视图动画标记的运动。在这里,你可以利用专门的机器人动画类(即动画,AnimationUtil,AnimationSet)

3)一旦你用动画做 - 添加标记MapView的叠加,现在在新的位置和无效覆盖

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

作为显示动画的选项,您可以使用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); 
}