views:

290

answers:

3

I'm working on an application that displays the location of moving items on a Google MapView. I need a way to update the position of the icons that represent the items (as well as change the facing of the icons every two seconds as updated data comes in).

I currently have an activity in the app that extends MapActivity. On to this I have overlaid a static Overlay that draws some lines on the map and an ItemizedOverlay that draws a static icon.

There is a draw() method that claims to be used by animated overlays, but overriding it to do my animations still doesn't make anything animate.

Do I need to tell the app to make my overlay animate, or do I need to use a different type of overlay?

+1  A: 

There are two things that I have in mind about your problem.

First, did you consider using invalidate() on the MapView to force a redraw? That's probably not the most efficient solution, but it should at least get you something you can work from.

Second, you can refresh the items on your map by calling the activity again. Here is an example.

ArtWorkAD
I have considered the invalidate option. From what I've read, it can be iffy on performance, but I'll give it a shot. What I wonder is: how do I invalidate the overlay ~20 times per second in order to smoothly animate the icons from place to place?
Hober
maybe you should consider using a timer thread, check out this http://www.anddev.org/viewtopic.php?t=126
ArtWorkAD
I ended up using a regular View and postInvalidating it from a TimerThread to give me the updates. As it happens, I don't want the map to be redrawn every frame, just the moving objects on this other view, so I'm looking in to use drawing cache to save the MapView. That said, your answer about timer threads was pretty much right. It lets you schedule the refresh for a fixed number of times per second so you can guarantee good framerate without displaying every possible frame.
Hober
A: 

I'm still pretty new to all this Android Stuff, but I was reading Android Unleashed 2nd ed (manning early access program version) the other day, where it covers Animations... which sounds like just the thing.

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

myItemizedOverlay.startAnimation( anim );

Note that I haven't actually tried anything of the sort, but that's what the book/JavaDoc leads me to believe will work. You will probably need to call prior to startAnimation(). Like I said... hardly my area of expertise (yet!).

I don't think you'll need to mess with invalidate at all with this approach.

Mark Storer
A: 

Using built-in capabilities of MapView and Overlays to draw animation will likely kill your perfromance. My suggestion is:

1) Combine MapView with another View. MapView will give you necessary screen coordinates and another view will serve as a canvas for animation. Both views should occupy the same screen positions (use frame layout);

2) Once you get positions of the map marker you want to animate - remove it from map and start doing animation of marker's movements using second view. Here you can leverage specialized android animation classes (i.e. Animation, AnimationUtil, AnimationSet)

3) Once you've done with animation - add marker to mapview overlay, now in its new position and invalidate overlay

Maybe there can be more optimal approach (i.e. use animation directly on MapView canvas), but the bottom line - you should use specialized animation mechanism to prevent perfromance issues.

Vlad