2010-09-25 9 views
10

Pracuję nad aplikacją, która wyświetla lokalizację ruchomych elementów w Google MapView. Potrzebuję sposobu na zaktualizowanie położenia ikon reprezentujących przedmioty (jak również zmianę wyglądu ikon co dwie sekundy w miarę dostarczania zaktualizowanych danych).Przenoszenie ikon na Android MapView

Mam obecnie aktywność w aplikacji, która rozszerza MapActivity. W tym celu nałożyłem statyczną nakładkę, która rysuje linie na mapie i ItemizedOverlay, która rysuje statyczną ikonę.

Istnieje metoda draw(), która twierdzi, że jest używana przez animowane nakładki, ale przesłonięcie jej powoduje, że moje animacje nadal nie powodują żadnych animacji.

Czy muszę poinformować aplikację, aby zrobiła animację mojej nakładki, czy muszę użyć innego typu nakładki?

Odpowiedz

4

Są dwie rzeczy, które mam na myśli o twoim problemie.

Po pierwsze, czy rozważałeś użycie unieważnić() na MapView, aby wymusić odświeżanie? To prawdopodobnie nie jest najbardziej wydajne rozwiązanie, ale przynajmniej powinno ci dać coś, nad czym możesz pracować.

Po drugie, możesz odświeżyć elementy na mapie, ponownie wywołując działanie. Oto example.

+0

Rozważałem opcję unieważnienia. Z tego, co przeczytałem, wynika, że ​​wydajność jest niewielka, ale zrobię to. Zastanawiam się: jak unieważnić nakładkę ~ 20 razy na sekundę, aby płynnie animować ikony z miejsca na miejsce? – Hober

+1

Może powinieneś rozważyć użycie wątku licznika czasu, sprawdź to http://www.anddev.org/viewtopic.php?t=126 –

+0

Skończyło się na używaniu zwykłego widoku i ponownej próbie jego sprawdzenia z TimerThread, aby dać mi aktualizacje. Tak się składa, że ​​nie chcę, aby mapa była przerysowywana w każdej klatce, tylko w ruchomych obiektach w tym innym widoku, więc szukam, aby użyć pamięci podręcznej rysunku, aby zapisać MapView. To powiedziawszy, twoja odpowiedź na temat wątków z timerem była całkiem słuszna. Pozwala zaplanować odświeżanie na określoną liczbę razy na sekundę, dzięki czemu można zagwarantować dobrą szybkość klatek bez wyświetlania każdej możliwej klatki. – Hober

0

Nadal jestem całkiem nowy w tym wszystkim w Androidzie, ale czytałem wczoraj wersję Android Unleashed 2nd ed (wcześniejszą wersję programu dostępowego), w której zawiera on animacje ... co brzmi jak coś.

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

myItemizedOverlay.startAnimation(anim); 

pamiętać, że nie zostały faktycznie próbował coś w tym rodzaju, ale to, co książka/JavaDoc prowadzi mnie do przypuszczenia, będzie działać. Prawdopodobnie będziesz musiał zadzwonić przed startAnimation(). Tak jak mówiłem ... prawie nie moja dziedzina wiedzy (jeszcze!).

Nie sądzę, że w tym podejściu będziecie musieli zadzierać z unieważnionymi.

+0

Uważam, że nie można używać animacji w ItemizedOverlays w ten sposób. – Tom

1

Korzystanie z wbudowanych funkcji MapView i Nakładek w celu narysowania animacji prawdopodobnie zabije Twój materiał perfumeryjny. Moja sugestia to:

1) Połącz MapView z innym widokiem. MapView da ci niezbędne współrzędne ekranu, a inny widok posłuży jako płótno do animacji. Oba widoki powinny zajmować te same pozycje ekranu (użyj układu klatek);

2) Gdy zdobędziesz pozycje znacznika mapy, który chcesz animować - usuń go z mapy i zacznij robić animację ruchów znacznika za pomocą drugiego widoku. Tutaj można wykorzystać wyspecjalizowane zajęcia android animacji (tj animacyjne, AnimationUtil, AnimationSet)

3) Po wykonaniu animacji - dodać znacznik MapView nakładkę, teraz w nowej pozycji i unieważnić nakładka

Może tam może być bardziej optymalnym podejściem (np. użyć animacji bezpośrednio na płótnie MapView), ale w dolnej linii - powinieneś użyć specjalnego mechanizmu animacji, aby zapobiec problemom z perfromacją.

0

Jako opcję wyświetlania animacji można użyć metody addView klasy MapView. To jest tak proste, jak:

  1. wystarczy utworzyć widok (jak ImageView lub inny widok);
  2. zainicjować układ widoku, utworzyć i przekazać MapView.LayoutParams do metody setLayoutParams;
  3. dodaj widok do MapView.

Widok zostanie przesunięty automatycznie po przewinięciu mapy.

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); 
} 
Powiązane problemy