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 Mapy
- Instalowanie zestawu SDK usług Google Play
- Zainstaluj usługę Xamarin.GooglePlayServices. pakiet Mapy z narzędzia NuGet
- Określanie wymaganych uprawnień
- Opcjonalnie utwórz emulator za pomocą interfejsów API Google
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:
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:
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...:
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.):
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. InterfejsMapFragment
API systemu Android wymaga poziomu 12 lub nowszego. Starsze wersje systemu Android mogą używać narzędzia SupportMapFragment. Ten przewodnik koncentruje się na korzystaniu zMapFragment
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 metodyMapView
cyklu życia działania.
Każdy z tych kontenerów uwidacznia Map
właściwość zwracającą wystąpienie GoogleMap
klasy . 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
:
Podobnie jak w przypadku innych klas Fragment, istnieją dwa sposoby dodawania elementu MapFragment
do działania:
Deklaratywnie —
MapFragment
element można dodać za pośrednictwem pliku układu XML dla działania. Poniższy fragment kodu XML przedstawia przykład użyciafragment
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ąpieniaMapFragment
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 przekazanieGoogleMapOptions
obiektu doNewInstance
obiektu . 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 MapFragment
przez 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):
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. CameraUpdate
obiekty 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:
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:
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ócinull
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:
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:
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
Polygon
s są podobne do Polyline
s, jednak nie są otwarte. Polygon
s są zamkniętą pętlą i mają ich wnętrze wypełnione. Polygon
s są tworzone w dokładnie taki sam sposób jak Polyline
, z wyjątkiem wywoływanej metody GoogleMap.AddPolygon .
Polyline
W 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 natrue
, 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 znacznikaMarkerClick
, 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.