2010-05-07 13 views
12

Próbuję narysować trasę na moim MapView. Rozszerzyłem nakładkę i zaimplementowałem metodę draw(). Trasa jest wyświetlana poprawnie, chociaż podczas debugowania, dodałem punkt przerwania na draw() i zauważyłem, że jest on wywoływany ciągle.Rysowanie jest ciągle wywoływane w mojej nakładce mapy Android

Chcę tylko, aby został ponownie narysowany, jeśli ktoś przesunie mapę lub powiększenia (losowanie uwzględnia te zmiany podczas rysowania trasy). Co może to powodować?

Odpowiedz

13

Istnieją dwie metody losowania, które można przesłonić.

void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) 

Opis: Narysuj nakładkę na mapie.

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when) Opis: narysuj wywołanie animowanych nakładek.

Pierwotnie zastąpiłem drugi.
Po przejściu na pierwszą metodę udało się.

2

Myślę, że metoda losowania jest wywoływana wielokrotnie, ponieważ tło jest przerysowane w sposób ciągły. spróbuj ustawić "MapView.ReticleDrawMode" na DRAW_RETICLE_UNDER. To w zasadzie mówi mapView, aby narysować wizualizację pod nakładkami. Metoda narysowania nakładki nie zostanie wywołana po przywołaniu tła. to naprawiło problem dla mnie.

uzyskać więcej informacji, zajrzyj tutaj: MapView Api

2

Potknąłem się, gdy nie zdawałem sobie sprawy, że metoda losowania jest nazywana nie tylko znacznikami, które rysujesz, ale również cieniem tych znaczników. Na przykład, jeśli masz dwa znaczniki i masz cienie ustawione na wartość true (co jest ustawieniem domyślnym), to będziesz miał 4 razy metodę losowania (raz dla każdego znacznika, raz dla każdego cienia znaczników)!

-1

Można po prostu dodać do swojej klasy ItemizedOverlay:

@Override public void draw(Canvas c, MapView m, boolean shadow) { super.draw(c, m, false);} 

To usunie cień z MapView nakładki.

1

Dla mnie wygląda to na dziwny błąd - czasami metoda ciągnięcia jest nazywana ciągłą, czasami nie.

patrz here.

2

Po dalszym przeglądzie rysowanie nakładki() działa tak, jak opisano w dokumentacji. Jedno losowanie dla shadow = true, a jedno dla shadow = false.

Interesujące jest to, że konkretna metoda draw() overlay odpowiada w sposób reklamowy dla każdego elementu narysowanego w MapView. Na przykład w moim przypadku wydaje się, że odpowiada ona na każdą mapę google, logo Google narysowane na mapie, a następnie na konkretną nakładkę, którą sam narysowałem. Oczywiście dwa razy dla każdego (shadow true | false).

Jest to prawdopodobnie zamierzony sposób renderowania map. Nie znalazłem ani nie spędziłem wystarczająco dużo czasu na szukanie tych informacji.

Ponadto, w moim własnym przypadku, mam przezroczysty panel renderowany na mojej mapie przy użyciu widgetów CheckBox (i) i TextView.TextView zmusza metodę draw() do nieprzerwanego uruchamiania, ponieważ widok tekstowy zawsze nasłuchuje wejścia i tym samym uruchamia przerysowanie nakładki.

1

W mojej aplikacji wyświetlany jest nieokreślony pasek postępu (na przykład wirujący okrąg), gdy ładuję dane sieciowe dla mapy. Po zakończeniu ładowania danych w sieci ustawiłem widoczność paska postępu na niewidoczną. Jednak spowodowało to ciągłe odświeżanie mapy, ponieważ wydaje się, że jakakolwiek animacja (którą zgaduję), która ma miejsce na mapie, spowoduje, że sama mapa zostanie przerysowana. Prostym rozwiązaniem jest ustawienie zamiast tego widoczności. Na przykład. to zmienić:

ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon); 
... 
//Network data now finished loading... 
loadingIcon.setVisibility(View.INVISIBLE); 

do tego:

loadingIcon.setVisibility(View.GONE); 

który usuwa go całkowicie z mapy, nie animuje się nad nim, a zatem nie powoduje draw(), aby nazwać nieskończoność.

+0

Wielkie dzięki za opublikowanie tego - właśnie rozwiązałeś problem, który doprowadzał mnie do szału. –

0

Wiem, że to stary problem, ale właśnie go spotkałem. To jest "za to, co jest warte".

Pętla losowania okazała się być błędem kodowania z mojej strony. Zgodnie z dokumentem, jeśli procedura losowania zwraca wartość true, wymaga natychmiastowej aktualizacji. Jeśli zostanie zwrócona wartość false, dla każdej nakładki wykonywane są tylko dwa przejścia; jeden za cień prawdziwy, a drugi za cień fałszywy. Zwróciłem prawdę, co spowodowało ciągłą aktualizację. Po zmianie na false, wystąpiły tylko dwa przejścia na nakładkę. Bez pętli.