Udostępnij za pośrednictwem


Korzystanie z interfejsu API Mapy Google w aplikacji

Korzystanie z aplikacji Mapy jest doskonałe, ale czasami chcesz dołączyć mapy bezpośrednio do aplikacji. Oprócz wbudowanej aplikacji map google oferuje również natywny interfejs API mapowania dla systemu Android. Interfejs API Mapy jest odpowiedni w przypadkach, w których chcesz zachować większą kontrolę nad środowiskiem mapowania. Elementy, które są możliwe za pomocą interfejsu API Mapy, obejmują:

  • Programowe zmienianie punktu widzenia mapy.
  • Dodawanie i dostosowywanie znaczników.
  • Dodawanie adnotacji do mapy z nakładkami.

W przeciwieństwie do przestarzałego interfejsu GOOGLE Mapy Android API w wersji 1, interfejs GOOGLE Mapy Android API v2 jest częścią usług Google Play. Aby można było korzystać z interfejsu API systemu Android Mapy Google, aplikacja Xamarin.Android musi spełniać pewne obowiązkowe wymagania wstępne.

Wymagania wstępne interfejsu API usługi Google Mapy

Przed użyciem interfejsu API Mapy należy wykonać kilka kroków, w tym:

Uzyskiwanie klucza interfejsu API usługi Google Mapy

Pierwszym krokiem jest uzyskanie klucza interfejsu API usługi Google Mapy (należy pamiętać, że nie można ponownie użyć klucza interfejsu API ze starszego interfejsu API google Mapy w wersji 1). Aby uzyskać informacje na temat uzyskiwania i używania klucza interfejsu API za pomocą platformy Xamarin.Android, zobacz Uzyskiwanie klucza interfejsu API usługi Google Mapy.

Instalowanie zestawu SDK usług Google Play

Usługi Google Play to technologia firmy Google, która umożliwia aplikacjom systemu Android korzystanie z różnych funkcji Google, takich jak Google+, Rozliczenia w aplikacji i Mapy. Te funkcje są dostępne na urządzeniach z systemem Android jako usługi w tle, które znajdują się w zestawie APK usług Google Play.

Aplikacje systemu Android współdziałają z usługami Google Play za pośrednictwem biblioteki klienta usług Google Play. Ta biblioteka zawiera interfejsy i klasy dla poszczególnych usług, takich jak Mapy. Na poniższym diagramie przedstawiono relację między aplikacją systemu Android a usługami Google Play:

Diagram illustrating the Google Play Store updating the Google Play Services APK

Interfejs API Mapy systemu Android jest dostarczany w ramach usług Google Play. Zanim aplikacja platformy Xamarin.Android będzie mogła korzystać z interfejsu API Mapy, zestaw SDK usług Google Play musi zostać zainstalowany przy użyciu Menedżera zestawów SDK systemu Android. Poniższy zrzut ekranu przedstawia, gdzie można znaleźć w Menedżerze zestawu Android SDK klienta usług Google Play:

Google Play Services appears under Extras in the Android SDK Manager

Uwaga

Usługi Google Play APK to licencjonowany produkt, który może nie być obecny na wszystkich urządzeniach. Jeśli nie jest zainstalowany, usługa Google Mapy nie będzie działać na urządzeniu.

Zainstaluj usługę Xamarin.GooglePlayServices. pakiet Mapy z narzędzia NuGet

Pakiet Xamarin.GooglePlayServices.Mapy zawiera powiązania platformy Xamarin.Android dla interfejsu API Mapy usług Google Play. Aby dodać pakiet Mapy usług Google Play, kliknij prawym przyciskiem myszy folder References projektu w Eksplorator rozwiązań i kliknij polecenie Zarządzaj pakietami NuGet...:

Solution Explorer showing Manage NuGet Packages context menu item under References

Spowoduje to otwarcie Menedżer pakietów NuGet. Kliknij przycisk Przeglądaj i wprowadź pozycję Usługi Xamarin Google Play Mapy w polu wyszukiwania. Wybierz pozycję Xamarin.GooglePlayServices.Mapy i kliknij przycisk Zainstaluj. (Jeśli ten pakiet został wcześniej zainstalowany, kliknij przycisk Update.):

NuGet Package Manager with Xamarin.GooglePlayServices.Maps package selected

Zwróć uwagę, że zainstalowane są również następujące pakiety zależności:

  • Xamarin.GooglePlayServices.Base
  • Xamarin.GooglePlayServices.Basement
  • Xamarin.GooglePlayServices.Tasks

Określanie wymaganych uprawnień

Aplikacje muszą identyfikować wymagania dotyczące sprzętu i uprawnień w celu korzystania z interfejsu API Mapy Google. Niektóre uprawnienia są automatycznie przyznawane przez zestaw SDK usług Google Play i nie jest konieczne, aby deweloper jawnie dodać je do AndroidManfest.XML:

  • Dostęp do stanu sieci — interfejs API Mapy musi mieć możliwość sprawdzenia, czy może pobrać kafelki mapy.

  • Dostęp do Internetu — dostęp do Internetu jest niezbędny do pobrania kafelków mapy i komunikacji z serwerami Google Play w celu uzyskania dostępu do interfejsu API.

Następujące uprawnienia i funkcje muszą być określone w AndroidManifest.XML dla interfejsu API systemu Android Mapy Google:

  • OpenGL ES v2 — aplikacja musi zadeklarować wymaganie dla platformy OpenGL ES w wersji 2.

  • Klucz interfejsu API usługi Google Mapy — klucz interfejsu API służy do potwierdzania, że aplikacja jest zarejestrowana i autoryzowana do korzystania z usług Google Play. Aby uzyskać szczegółowe informacje na temat tego klucza, zobacz Uzyskiwanie klucza interfejsu API Mapy Google.

  • Zażądaj starszego klienta HTTP apache — aplikacje przeznaczone dla systemu Android 9.0 (poziom interfejsu API 28) lub nowszego muszą określać, że starszy klient HTTP Apache jest opcjonalną biblioteką do użycia.

  • Dostęp do usług internetowych Firmy Google — aplikacja musi mieć uprawnienia dostępu do usług internetowych firmy Google, które z powrotem interfejsu API Mapy systemu Android.

  • Uprawnienia do powiadomień usług Google Play — aplikacja musi mieć uprawnienie do odbierania powiadomień zdalnych z usług Google Play.

  • Dostęp do dostawców lokalizacji — są to opcjonalne uprawnienia. Umożliwią GoogleMap one klasie wyświetlanie lokalizacji urządzenia na mapie.

Ponadto system Android 9 usunął bibliotekę klienta HTTP Apache z ścieżki bootclasspath i dlatego nie jest dostępny dla aplikacji przeznaczonych dla interfejsu API 28 lub nowszego. Następujący wiersz należy dodać do application węzła pliku AndroidManifest.xml , aby nadal korzystać z klienta HTTP Apache w aplikacjach przeznaczonych dla interfejsu API 28 lub nowszego:

<application ...>
   ...
   <uses-library android:name="org.apache.http.legacy" android:required="false" />    
</application>

Uwaga

Bardzo stare wersje zestawu Google Play SDK wymagały, aby aplikacja zażądała WRITE_EXTERNAL_STORAGE uprawnień. To wymaganie nie jest już konieczne w przypadku ostatnich powiązań platformy Xamarin dla usług Google Play.

Poniższy fragment kodu to przykład ustawień, które należy dodać do AndroidManifest.XML:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="4.5" package="com.xamarin.docs.android.mapsandlocationdemo2" android:versionCode="6">
    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="28" />

    <!-- Google Maps for Android v2 requires OpenGL ES v2 -->
    <uses-feature android:glEsVersion="0x00020000" android:required="true" />

    <!-- Necessary for apps that target Android 9.0 or higher -->
    <uses-library android:name="org.apache.http.legacy" android:required="false" />

    <!-- Permission to receive remote notifications from Google Play Services -->
    <!-- Notice here that we have the package name of our application as a prefix on the permissions. -->
    <uses-permission android:name="<PACKAGE NAME>.permission.MAPS_RECEIVE" />
    <permission android:name="<PACKAGE NAME>.permission.MAPS_RECEIVE" android:protectionLevel="signature" />

    <!-- These are optional, but recommended. They will allow Maps to use the My Location provider. -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application android:label="@string/app_name">
        <!-- Put your Google Maps V2 API Key here. -->
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="YOUR_API_KEY" />
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
        <!-- Necessary for apps that target Android 9.0 or higher -->
        <uses-library android:name="org.apache.http.legacy" android:required="false" />
    </application>
</manifest>

Oprócz żądania uprawnień AndroidManifest.XML aplikacja musi również wykonać kontrole uprawnień środowiska uruchomieniowego dla uprawnień ACCESS_COARSE_LOCATION i ACCESS_FINE_LOCATION . Aby uzyskać więcej informacji na temat przeprowadzania testów uprawnień w czasie wykonywania, zobacz Przewodnik po uprawnieniach platformy Xamarin.Android.

Tworzenie emulatora za pomocą interfejsów API Google

W przypadku, gdy fizyczne urządzenie z systemem Android z usługami Google Play nie jest zainstalowane, można utworzyć obraz emulatora na potrzeby programowania. Aby uzyskać więcej informacji, zobacz Menedżer urządzeń.

Klasa GoogleMap

Po spełnieniu wymagań wstępnych nadszedł czas, aby rozpocząć tworzenie aplikacji i korzystać z interfejsu API Mapy systemu Android. Klasa GoogleMap jest głównym interfejsem API używanym przez aplikację platformy Xamarin.Android do wyświetlania i interakcji z Mapy Google dla systemu Android. Ta klasa ma następujące obowiązki:

  • Interakcja z usługami Google Play w celu autoryzowania aplikacji z usługą internetową Google.

  • Pobieranie, buforowanie i wyświetlanie kafelków mapy.

  • Wyświetlanie kontrolek interfejsu użytkownika, takich jak przesuwanie i powiększanie użytkownika.

  • Znaczniki rysunku i kształty geometryczne na mapach.

Element GoogleMap jest dodawany do działania na jeden z dwóch sposobów:

  • MapFragment — MapFragment to wyspecjalizowany fragment, który działa jako host GoogleMap obiektu. Interfejs MapFragment API systemu Android wymaga poziomu 12 lub nowszego. Starsze wersje systemu Android mogą używać narzędzia SupportMapFragment. Ten przewodnik koncentruje się na korzystaniu z MapFragment klasy .

  • MapView — obiekt MapView to wyspecjalizowana podklasa View, która może pełnić rolę hosta dla GoogleMap obiektu. Użytkownicy tej klasy muszą przekazać do klasy wszystkie metody MapView cyklu życia działania.

Każdy z tych kontenerów uwidacznia Map właściwość zwracającą wystąpienie GoogleMapklasy . Preferencje powinny być podane do klasy MapFragment , ponieważ jest to prostszy interfejs API, który zmniejsza ilość standardowy kod, który deweloper musi ręcznie zaimplementować.

Dodawanie mapFragment do działania

Poniższy zrzut ekranu to przykład prosty MapFragment:

Screenshot of a device displaying a Google Map fragment

Podobnie jak w przypadku innych klas Fragment, istnieją dwa sposoby dodawania elementu MapFragment do działania:

  • DeklaratywnieMapFragment element można dodać za pośrednictwem pliku układu XML dla działania. Poniższy fragment kodu XML przedstawia przykład użycia fragment elementu:

    <?xml version="1.0" encoding="utf-8"?>
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/map"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              class="com.google.android.gms.maps.MapFragment" />
    
  • Programowo — MapFragment można programowo utworzyć wystąpienie za pomocą MapFragment.NewInstance metody , a następnie dodać je do działania. Ten fragment kodu przedstawia najprostszy sposób tworzenia wystąpienia MapFragment obiektu i dodawania do działania:

        var mapFrag = MapFragment.NewInstance();
        activity.FragmentManager.BeginTransaction()
                                .Add(Resource.Id.map_container, mapFrag, "map_fragment")
                                .Commit();
    
    

    Istnieje możliwość skonfigurowania MapFragment obiektu przez przekazanie GoogleMapOptions obiektu do NewInstanceobiektu . Omówiono to w sekcji Właściwości GoogleMap, które są wyświetlane w dalszej części tego przewodnika.

Metoda MapFragment.GetMapAsync służy do inicjowania GoogleMap obiektu hostowanego przez fragment i uzyskiwania odwołania do obiektu mapy hostowanego MapFragmentprzez obiekt . Ta metoda przyjmuje obiekt, który implementuje IOnMapReadyCallback interfejs.

Ten interfejs ma jedną metodę, która zostanie wywołana, IMapReadyCallback.OnMapReady(MapFragment map) gdy aplikacja będzie możliwa do interakcji z obiektem GoogleMap . Poniższy fragment kodu pokazuje, jak działanie systemu Android może zainicjować MapFragment interfejs i zaimplementować IOnMapReadyCallback go:

public class MapWithMarkersActivity : AppCompatActivity, IOnMapReadyCallback
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.MapLayout);

        var mapFragment = (MapFragment) FragmentManager.FindFragmentById(Resource.Id.map);
        mapFragment.GetMapAsync(this);

        // remainder of code omitted
    }

    public void OnMapReady(GoogleMap map)
    {
        // Do something with the map, i.e. add markers, move to a specific location, etc.
    }
}

Typy map

Istnieje pięć różnych typów map dostępnych w interfejsie API Mapy Google:

  • Normalny — jest to domyślny typ mapy. Przedstawia drogi i ważne cechy naturalne wraz ze sztucznymi punktami orientacyjnymi (takimi jak budynki i mosty).

  • Satelita - Ta mapa pokazuje fotografię satelitarną.

  • Hybryda — ta mapa przedstawia fotografię satelitarną i mapy drogowe.

  • Teren — to przede wszystkim pokazuje cechy topograficzne z niektórymi drogami.

  • Brak — ta mapa nie ładuje żadnych kafelków, jest renderowana jako pusta siatka.

Na poniższej ilustracji przedstawiono trzy z różnych typów map od lewej do prawej (normalny, hybrydowy, teren):

Three map example screenshots: Normal, Hybrid, and Terrain

Właściwość GoogleMap.MapType służy do ustawiania lub zmieniania typu mapy. Poniższy fragment kodu przedstawia sposób wyświetlania mapy satelitarnej.

public void OnMapReady(GoogleMap map)
{
    map.MapType = GoogleMap.MapTypeHybrid;
}

Właściwości mapy GoogleMap

GoogleMap definiuje kilka właściwości, które mogą kontrolować funkcjonalność i wygląd mapy. Jednym ze sposobów skonfigurowania początkowego stanu obiektu GoogleMap jest przekazanie obiektu GoogleMapOptions podczas tworzenia obiektu MapFragment. Poniższy fragment kodu jest jednym z przykładów użycia GoogleMapOptions obiektu podczas tworzenia obiektu MapFragment:

GoogleMapOptions mapOptions = new GoogleMapOptions()
    .InvokeMapType(GoogleMap.MapTypeSatellite)
    .InvokeZoomControlsEnabled(false)
    .InvokeCompassEnabled(true);

FragmentTransaction fragTx = FragmentManager.BeginTransaction();
mapFragment = MapFragment.NewInstance(mapOptions);
fragTx.Add(Resource.Id.map, mapFragment, "map");
fragTx.Commit();

Innym sposobem skonfigurowania elementu GoogleMap jest manipulowanie właściwościami w interfejsie użytkownika Ustawienia obiektu mapy. W następnym przykładzie kodu pokazano, jak skonfigurować kontrolki GoogleMap powiększenia i kompas:

public void OnMapReady(GoogleMap map)
{
    map.UiSettings.ZoomControlsEnabled = true;
    map.UiSettings.CompassEnabled = true;
}

Interakcja z aplikacją GoogleMap

Interfejs API Mapy systemu Android udostępnia interfejsy API, które umożliwiają działanie zmiany punktu widzenia, dodawanie znaczników, umieszczanie niestandardowych nakładek lub rysowanie kształtów geometrycznych. W tej sekcji omówiono sposób wykonywania niektórych z tych zadań w środowisku Xamarin.Android.

Zmienianie punktu widzenia

Mapy są modelowane jako płaska płaszczyzna na ekranie, na podstawie projekcji Mercator. Widok mapy to aparat patrząc prosto w dół na tej płaszczyźnie. Położenie aparatu można kontrolować przez zmianę położenia, powiększenia, pochylenia i łożyska. Klasa Aparat Update służy do przenoszenia lokalizacji aparatu. CameraUpdateobiekty nie są bezpośrednio tworzone, zamiast tego interfejs API Mapy udostępnia klasę Aparat UpdateFactory.

Po utworzeniu CameraUpdate obiektu jest on przekazywany jako parametr do metod GoogleMap.Move Aparat lub GoogleMap.Animate Aparat. Metoda MoveCamera aktualizuje mapę natychmiast, gdy AnimateCamera metoda zapewnia płynne, animowane przejście.

Ten fragment kodu to prosty przykład użycia CameraUpdateFactory elementu w celu utworzenia obiektu CameraUpdate , który zwiększy poziom powiększenia mapy o jeden poziom powiększenia:

MapFragment mapFrag = (MapFragment) FragmentManager.FindFragmentById(Resource.Id.my_mapfragment_container);
mapFrag.GetMapAsync(this);
...

public void OnMapReady(GoogleMap map)
{   
    map.MoveCamera(CameraUpdateFactory.ZoomIn());
}

Interfejs API Mapy udostępnia Aparat Position, który agreguje wszystkie możliwe wartości pozycji aparatu. Wystąpienie tej klasy można podać do metody Aparat UpdateFactory.New Aparat Position, która zwróci CameraUpdate obiekt. Interfejs API Mapy zawiera również klasę Aparat Position.Builder, która zapewnia płynny interfejs API do tworzenia CameraPosition obiektów. Poniższy fragment kodu przedstawia przykład tworzenia elementu CameraUpdate na podstawie elementu CameraPosition i przy użyciu go w celu zmiany położenia aparatu w obiekcie GoogleMap:

public void OnMapReady(GoogleMap map)
{
    LatLng location = new LatLng(50.897778, 3.013333);

    CameraPosition.Builder builder = CameraPosition.InvokeBuilder();
    builder.Target(location);
    builder.Zoom(18);
    builder.Bearing(155);
    builder.Tilt(65);

    CameraPosition cameraPosition = builder.Build();

    CameraUpdate cameraUpdate = CameraUpdateFactory.NewCameraPosition(cameraPosition);

    map.MoveCamera(cameraUpdate);
}

W poprzednim fragmencie kodu określona lokalizacja na mapie jest reprezentowana przez klasę LatLng . Poziom powiększenia jest ustawiony na 18, czyli dowolną miarę powiększenia używanego przez Mapy Google. Łożysko jest pomiarem kompasu zgodnie z ruchem wskazówek zegara z Północy. Właściwość Tilt kontroluje kąt wyświetlania i określa kąt 25 stopni z pionu. Poniższy zrzut ekranu przedstawia po GoogleMap wykonaniu poprzedniego kodu:

Example Google Map showing a specified location with a tilted viewing angle

Rysowanie na mapie

Interfejs API Mapy systemu Android udostępnia interfejs API do rysowania następujących elementów na mapie:

  • Znaczniki — są to specjalne ikony używane do identyfikowania pojedynczej lokalizacji na mapie.

  • Nakładki — jest to obraz, który może służyć do identyfikowania kolekcji lokalizacji lub obszaru na mapie.

  • Linie, wielokąty i okręgi — są to interfejsy API, które umożliwiają działanie dodawania kształtów do mapy.

Znaczniki

Interfejs API Mapy udostępnia klasę Marker, która hermetyzuje wszystkie dane dotyczące jednej lokalizacji na mapie. Domyślnie klasa Marker używa standardowej ikony udostępnionej przez usługę Google Mapy. Istnieje możliwość dostosowania wyglądu znacznika i reagowania na kliknięcia użytkownika.

Dodawanie znacznika

Aby dodać znacznik do mapy, należy utworzyć nowy obiekt MarkerOptions , a następnie wywołać metodę AddMarker w wystąpieniu GoogleMap . Ta metoda zwróci obiekt Znacznik .

public void OnMapReady(GoogleMap map)
{
    MarkerOptions markerOpt1 = new MarkerOptions();
    markerOpt1.SetPosition(new LatLng(50.379444, 2.773611));
    markerOpt1.SetTitle("Vimy Ridge");

    map.AddMarker(markerOpt1);
}

Tytuł znacznika zostanie wyświetlony w oknie informacji po naciśnięciu znacznika przez użytkownika. Poniższy zrzut ekranu przedstawia wygląd tego znacznika:

Example Google Map with a marker and an info window for Vimy Ridge

Dostosowywanie znacznika

Można dostosować ikonę używaną przez znacznik, wywołując MarkerOptions.InvokeIcon metodę podczas dodawania znacznika do mapy. Ta metoda przyjmuje obiekt BitmapDescriptor zawierający dane niezbędne do renderowania ikony. Klasa BitmapDescriptorFactory udostępnia kilka metod pomocnika, aby uprościć tworzenie elementu BitmapDescriptor. Na poniższej liście przedstawiono niektóre z następujących metod:

  • DefaultMarker(float colour)– Użyj domyślnego znacznika Google Mapy, ale zmień kolor.

  • FromAsset(string assetName) — użyj ikony niestandardowej z określonego pliku w folderze Assets.

  • FromBitmap(Bitmap image) — użyj określonej mapy bitowej jako ikony.

  • FromFile(string fileName) — Utwórz ikonę niestandardową z pliku w określonej ścieżce.

  • FromResource(int resourceId) — Utwórz ikonę niestandardową na podstawie określonego zasobu.

Poniższy fragment kodu przedstawia przykład tworzenia znacznika domyślnego w kolorze cyjanowym:

public void OnMapReady(GoogleMap map)
{
    MarkerOptions markerOpt1 = new MarkerOptions();
    markerOpt1.SetPosition(new LatLng(50.379444, 2.773611));
    markerOpt1.SetTitle("Vimy Ridge");

    var bmDescriptor = BitmapDescriptorFactory.DefaultMarker (BitmapDescriptorFactory.HueCyan);
    markerOpt1.InvokeIcon(bmDescriptor);

    map.AddMarker(markerOpt1);
}

Okna informacji

Okna informacyjne to specjalne okna wyskakujące w celu wyświetlenia informacji dla użytkownika po naciśnięciu określonego znacznika. Domyślnie w oknie informacji zostanie wyświetlona zawartość tytułu znacznika. Jeśli tytuł nie został przypisany, nie zostanie wyświetlone żadne okno informacji. Jednocześnie może być wyświetlane tylko jedno okno informacji.

Istnieje możliwość dostosowania okna informacji przez zaimplementowanie interfejsu GoogleMap.IInfoWindowAdapter . W tym interfejsie istnieją dwie ważne metody:

  • public View GetInfoWindow(Marker marker) — Ta metoda jest wywoływana w celu uzyskania niestandardowego okna informacji dla znacznika. Jeśli zwróci null wartość , zostanie użyte domyślne renderowanie okna. Jeśli ta metoda zwróci widok, ten widok zostanie umieszczony w ramce okna informacji.

  • public View GetInfoContents(Marker marker) — Ta metoda będzie wywoływana tylko wtedy, gdy funkcja GetInfoWindow zwróci wartość null . Ta metoda może zwrócić null wartość, jeśli ma być używane domyślne renderowanie zawartości okna informacji. W przeciwnym razie ta metoda powinna zwrócić widok z zawartością okna informacji.

Okno informacji nie jest widokiem na żywo — zamiast tego system Android przekonwertuje widok na statyczną mapę bitową i wyświetli je na obrazie. Oznacza to, że okno informacji nie może reagować na żadne zdarzenia lub gesty dotykowe, ani nie zostanie automatycznie zaktualizowane. Aby zaktualizować okno informacji, należy wywołać metodę GoogleMap.ShowInfoWindow .

Na poniższej ilustracji przedstawiono kilka przykładów niektórych dostosowanych okien informacji. Obraz po lewej stronie ma dostosowaną zawartość, a obraz po prawej stronie ma okno i zawartość dostosowaną z zaokrąglonymi rogami:

Example marker windows for Melbourne, including icon and population. The right window has rounded corners.

Nakładki naziemne

W przeciwieństwie do znaczników, które identyfikują określoną lokalizację na mapie, obiekt GroundOverlay jest obrazem używanym do identyfikowania kolekcji lokalizacji lub obszaru na mapie.

Dodawanie nakładki GroundOverlay

Dodawanie nakładki naziemnej do mapy jest podobne do dodawania znacznika do mapy. Najpierw jest tworzony obiekt GroundOverlayOptions. Ten obiekt jest następnie przekazywany jako parametr do GoogleMap.AddGroundOverlay metody, która zwróci GroundOverlay obiekt. Ten fragment kodu to przykład dodawania nakładki naziemnej do mapy:

BitmapDescriptor image = BitmapDescriptorFactory.FromResource(Resource.Drawable.polarbear);
GroundOverlayOptions groundOverlayOptions = new GroundOverlayOptions()
    .Position(position, 150, 200)
    .InvokeImage(image);
GroundOverlay myOverlay = googleMap.AddGroundOverlay(groundOverlayOptions);

Poniższy zrzut ekranu przedstawia tę nakładkę na mapie:

Example map with an overlayed image of a polar bear

Linie, okręgi i wielokąty

Istnieją trzy proste typy figur geometrycznych, które można dodać do mapy:

  • Polyline — jest to seria połączonych segmentów linii. Może oznaczać ścieżkę na mapie lub utworzyć kształt geometryczny.

  • Okrąg — spowoduje to narysowanie okręgu na mapie.

  • Wielokąt — jest to zamknięty kształt oznaczania obszarów na mapie.

Polilinie

Polyline to lista kolejnych LatLng obiektów, które określają wierzchołki poszczególnych segmentów linii. Linia wieloliniowa jest tworzona przez najpierw utworzenie PolylineOptions obiektu i dodanie do niego punktów. Obiekt PolylineOption jest następnie przekazywany do GoogleMap obiektu przez wywołanie AddPolyline metody .

PolylineOption rectOptions = new PolylineOption();
rectOptions.Add(new LatLng(37.35, -122.0));
rectOptions.Add(new LatLng(37.45, -122.0));
rectOptions.Add(new LatLng(37.45, -122.2));
rectOptions.Add(new LatLng(37.35, -122.2));
rectOptions.Add(new LatLng(37.35, -122.0)); // close the polyline - this makes a rectangle.

googleMap.AddPolyline(rectOptions);
Okręgi

Okręgi są tworzone przez utworzenie pierwszego wystąpienia obiektu CircleOption , który określi środek i promień okręgu w metrach. Okrąg jest rysowany na mapie, wywołując element GoogleMap.AddCircle. Poniższy fragment kodu pokazuje, jak narysować okrąg:

CircleOptions circleOptions = new CircleOptions ();
circleOptions.InvokeCenter (new LatLng(37.4, -122.1));
circleOptions.InvokeRadius (1000);

googleMap.AddCircle (circleOptions);
Wielokątów

Polygons są podobne do Polylines, jednak nie są otwarte. Polygons są zamkniętą pętlą i mają ich wnętrze wypełnione. Polygons są tworzone w dokładnie taki sam sposób jak Polyline, z wyjątkiem wywoływanej metody GoogleMap.AddPolygon .

PolylineW przeciwieństwie do klasy , element Polygon jest samozamykający. Wielokąt zostanie zamknięty przez metodę AddPolygon , rysując linię łączącą pierwsze i ostatnie punkty. Poniższy fragment kodu utworzy pełny prostokąt w tym samym obszarze co poprzedni fragment kodu w przykładzie Polyline .

PolygonOptions rectOptions = new PolygonOptions();
rectOptions.Add(new LatLng(37.35, -122.0));
rectOptions.Add(new LatLng(37.45, -122.0));
rectOptions.Add(new LatLng(37.45, -122.2));
rectOptions.Add(new LatLng(37.35, -122.2));
// notice we don't need to close off the polygon

googleMap.AddPolygon(rectOptions);

Reagowanie na zdarzenia użytkownika

Istnieją trzy typy interakcji, które użytkownik może mieć z mapą:

  • Kliknięcie znacznika — użytkownik klika znacznik.

  • Przeciąganie znacznika — użytkownik kliknął długo na mparger

  • Kliknięcie okna informacji — użytkownik kliknął okno informacji.

Każde z tych zdarzeń zostanie omówione bardziej szczegółowo poniżej.

Zdarzenia kliknięcia znacznika

Zdarzenie MarkerClicked jest zgłaszane, gdy użytkownik naciągnie znacznik. To zdarzenie akceptuje GoogleMap.MarkerClickEventArgs obiekt jako parametr. Ta klasa zawiera dwie właściwości:

  • GoogleMap.MarkerClickEventArgs.Handled — Ta właściwość powinna być ustawiona na true , aby wskazać, że program obsługi zdarzeń zużyje zdarzenie. Jeśli ta opcja zostanie ustawiona na wartość , zachowanie domyślne będzie występować false oprócz niestandardowego zachowania programu obsługi zdarzeń.

  • Marker — Ta właściwość jest odwołaniem do znacznika MarkerClick , który wywołał zdarzenie.

Ten fragment kodu przedstawia przykład, MarkerClick który zmieni położenie aparatu na nową lokalizację na mapie:

void MapOnMarkerClick(object sender, GoogleMap.MarkerClickEventArgs markerClickEventArgs)
{
    markerClickEventArgs.Handled = true;

    var marker = markerClickEventArgs.Marker;
    if (marker.Id.Equals(gotMauiMarkerId))
    {
        LatLng InMaui = new LatLng(20.72110, -156.44776);

        // Move the camera to look at Maui.
        PositionPolarBearGroundOverlay(InMaui);
        googleMap.AnimateCamera(CameraUpdateFactory.NewLatLngZoom(InMaui, 13));
        gotMauiMarkerId = null;
        polarBearMarker.Remove();
        polarBearMarker = null;
    }
    else
    {
        Toast.MakeText(this, $"You clicked on Marker ID {marker.Id}", ToastLength.Short).Show();
    }
}

Przeciąganie znaczników zdarzeń

To zdarzenie jest zgłaszane, gdy użytkownik chce przeciągnąć znacznik. Domyślnie znaczniki nie można przeciągać. Znacznik można ustawić jako przeciągany, ustawiając Marker.Draggable MarkerOptions.Draggable właściwość na true lub wywołując metodę true jako parametr.

Aby przeciągnąć znacznik, użytkownik musi najpierw kliknąć znacznik, a następnie pozostać na mapie. Gdy palec użytkownika zostanie przeciągnięty na ekranie, znacznik zostanie przeniesiony. Gdy palec użytkownika zniesie ekran, znacznik pozostanie na miejscu.

Na poniższej liście opisano różne zdarzenia, które zostaną zgłoszone dla znacznika przeciąganego:

  • GoogleMap.MarkerDragStart(object sender, GoogleMap.MarkerDragStartEventArgs e) — To zdarzenie jest zgłaszane, gdy użytkownik najpierw przeciąga znacznik.

  • GoogleMap.MarkerDrag(object sender, GoogleMap.MarkerDragEventArgs e) — To zdarzenie jest zgłaszane w miarę przeciągania znacznika.

  • GoogleMap.MarkerDragEnd(object sender, GoogleMap.MarkerDragEndEventArgs e) — To zdarzenie jest zgłaszane po zakończeniu przeciągania znacznika przez użytkownika.

Każda z nich EventArgs zawiera jedną właściwość o nazwie P0 , która jest odwołaniem do Marker przeciąganego obiektu.

Zdarzenia kliknięcia okna informacji

Jednocześnie można wyświetlić tylko jedno okno informacji. Gdy użytkownik kliknie okno informacji na mapie, obiekt mapy zgłosi InfoWindowClick zdarzenie. Poniższy fragment kodu pokazuje, jak połączyć program obsługi ze zdarzeniem:

public void OnMapReady(GoogleMap map)
{
    map.InfoWindowClick += MapOnInfoWindowClick;
}

private void MapOnInfoWindowClick (object sender, GoogleMap.InfoWindowClickEventArgs e)
{
    Marker myMarker = e.Marker;
    // Do something with marker.
}

Pamiętaj, że okno informacji jest statyczne View , które jest renderowane jako obraz na mapie. Wszystkie widżety, takie jak przyciski, pola wyboru lub widoki tekstowe umieszczone wewnątrz okna informacji, będą obojętne i nie mogą reagować na żadne z ich całkowitych zdarzeń użytkownika.