10

Pracuję nad prostą aplikacją, w której już wyświetlany jest tytuł znacznika z numerem mrkr.showInfoWindow(), ale nie chcę, aby użytkownik ponownie dotknął tego znacznika. Jak wyłączyć kliknięcie zdarzenia określonego znacznika?Jak wyłączyć zdarzenie kliknięcia znacznika?

Tak właśnie próbowałem.

Marker marker = gMap.addMarker(new MarkerOptions().position(new LatLng(location 
        .getLatitude(), location.getLongitude())).title("I am here").icon(BitmapDescriptorFactory.fromResource(R.drawable.mrk1))); 
      marker.showInfoWindow(); 
//how to use marker.setClickable here or somthing here.? 

Jak wyświetlić tę infowindow()/tytuł mojego markera całej mojej aplikacji?

Odpowiedz

13

Można ustawić onMarkerClickListener w obiekcie GoogleMap

map.setOnMarkerClickListener(new OnMarkerClickListener() { 
     @Override 
     public boolean onMarkerClick(Marker marker) { 
      return true; 
     } 
    }); 
+0

Jeśli chcesz wyłączyć wydarzenie click rynku, to myślę, że to nie jest poprawna odpowiedź. – Kedarnath

+1

zadziałało. ale mam wiele znaczników. czy wyłączenie jednego kliknięcia znacznika jest możliwe.? – Aparichith

+0

http://developer.android.com/reference/com/google/android/gms/maps/GoogleMap.OnMarkerClickListener.html doc mówi, że metoda zwraca wartość true, jeśli nie chcemy domyślnego zachowania – Wishmaster

0

Można użyć onMarkerClickListener za to jak poniżej,

mMap.setOnMarkerClickListener(new OnMarkerClickListener() 
{ 
    @Override 
    public boolean onMarkerClick (Marker marker) 
    { 
     // do nothing 
     return false; 
    } 
}); 
+1

Próbowałem zwracając true. jego działało. Ale mam wiele znaczników.Aby wyłączyć wszystkie inne znaczniki kliknij zdarzenie .. Czy wyłączenie jednego określonego znacznika jest możliwe. – Aparichith

+0

"prawda" oznacza, że ​​umożliwia kliknięcie, a następnie, w jaki sposób może wyłączyć wydarzenie kliknięcia? – Kedarnath

+0

także zastanawiałem się, ale działa. wyłączyło zdarzenie kliknięcia wszystkich znaczników. – Aparichith

1

Oczywiste jest przez ten punkt 3 lata później, że nie ma sposobu, aby pozwól, aby kliknięcia znaczników przeszły przez samą mapę (OnMapClickListener). Markery będą zawsze przechwytywać to zdarzenie, chociaż możesz wyłączyć domyślne zachowanie z kliknięcia (jak pokazuje powyższa odpowiedź). Poniższe informacje są zamieszczane na wypadek, gdyby ktoś mógł nadal potrzebować lepszego rozwiązania.

Aby obejść to ograniczenie, istnieją dwie opcje. Zaimplementowałem oba i mogę oczyścić i udostępnić kod na żądanie.

1.) Utwórz mapę bitową GroundOverlay, która ma punkty na drodze, którymi nie chcesz się malować na niej. Używasz obiektu Projektu GoogleMap do konwersji z ekranu Punkty na LatLng i obliczenia, gdzie umieścić Bitmapę, aby punkty trasy pojawiały się w odpowiednim miejscu. Jest dość skomplikowany w obsłudze rotacji, dopełniania map i kilku innych problemów. Podczas powiększania znaczniki punktów orientacyjnych powiększają się, a następnie w zdarzeniu onCameraIdle, ponownie tworzysz bitmapę i zmieniasz położenie GroundOverlay, jeśli to konieczne. Jest to metoda, której używam w produkcji. Przesuwanie, obracanie i powiększanie są bardzo płynne, a ponieważ nakładki naziemne można ustawić tak, aby obsługiwały lub nie obsługują odczepów, rozwiązuje to problem. Nie byłem w stanie wymyślić, jak wykonać tę pracę z pochyleniem. Same punkty trasy nie pozostają zwrócone w kierunku północnym podczas obrotu, ale można je obracać w pionie po odtworzeniu GroundOverlay. Po włączeniu funkcji onCameraIdle na mapie pojawia się krótka pauza/brak reakcji.

2.) Utwórz obiekt View obejmujący cały ekran i maluje znaczniki punktów na drodze w metodzie onDraw widoku. Ponownie użyj obiektu projekcyjnego GoogleMap, aby obliczyć miejsce malowania znaczników. Wywołaj funkcję unieważniającą() w widoku podczas zdarzenia onCameraMove, aby znaczniki były rysowane ponownie na nowych pozycjach na ekranie. Główną zaletą jest prostota. Obracanie, pochylanie, przesunięcia mapy są obsługiwane za Ciebie. Główną wadą jest to, że jeśli unieważnisz na każdym zdarzeniu onCameraMove, jest to zbyt intensywne cpu (przypuszczam), a panoramowanie/powiększanie mapy może stać się niestabilne. Jeśli unieważnisz co 3 lub 5 zdarzeń ruchu, punkty orientacyjne będą się odbijać podczas przesuwania/powiększania, ponieważ nie są odświeżane w ich nowej pozycji wystarczająco często. Jednak nie ma opóźnienia na końcu ruchu mapy. Ostatecznie, ze 100-200 punktami na mapie, problemy z wydajnością "while-panning" były dla mnie zbyt widoczne.

Mam nadzieję, że to komuś pomaga. Daj mi znać, jeśli potrzebujesz pomocy związanej z kodem.

+0

Trzecią opcją jest przechwycenie mapy za pomocą grupy ViewGroup zawierającej ViewGroup i użyj Projekcji, aby określić, gdzie dotknął użytkownika. Wszystko zależy od tego, co próbujesz zrobić. Odpowiedź znalazłem tutaj: http://stackoverflow.com/questions/14013002/google-maps-android-api-v2-detect-touch-on-map – JustinMorris

Powiązane problemy