我正在开发一个应用程序,用于显示Google MapView上移动项目的位置。我需要一种方法来更新代表项目的图标的位置(以及在更新数据进入时每两秒更改图标的面部)。
我目前在应用中有一个扩展MapActivity的活动。在此我已经覆盖了一个静态叠加层,它在地图上绘制了一些线条,以及一个绘制静态图标的ItemizedOverlay。
有一个draw()方法声称由动画叠加层使用,但是覆盖它来制作我的动画仍然没有做任何动画。
我是否需要告诉应用程序使我的叠加层动画,或者我是否需要使用其他类型的叠加?
答案 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方法。 它很简单:
滚动地图时,视图会自动移动。
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);
}