Использование API Карт Google в приложении

Использовать приложение Карты удобно, но иногда требуется добавить карты непосредственно в свое приложение. Помимо встроенного приложения карт, Google также предлагает собственный API сопоставления для Android. API Карт подходит для случаев, когда требуется обеспечить больший контроль над процессом сопоставления. Возможности API Карт:

  • программное изменение перспективы на карте;
  • добавление и настройка маркеров;
  • наложение на карту заметок.

В отличие от устаревшего API Карт Google для Android версии 1, API Карт Google для Android версии 2 является частью Сервисов Google Play. Приложение Xamarin.Android должно соответствовать определенным требованиям, чтобы использовать API Карт Google для Android.

Необходимые условия для использования API Карт Google

Прежде чем можно будет использовать API Карт, необходимо выполнить несколько шагов, в том числе:

Получение ключа API Карт Google

Первым шагом является получение ключа API Карт Google. Учтите, что невозможно будет использовать ключ API из устаревшего выпуска API Карт Google версии 1. Сведения о том, как получить ключ API и использовать его в Xamarin.Android, см. в разделе Получение ключа API Google Maps.

установить пакет SDK Сервисов Google Play;

Сервисы Google Play — это технология Google, которая позволяет приложениям Android использовать преимущества различных функций Google, таких как Google+, In-App Billing и Карты. Эти функции доступны на устройствах Android в качестве фоновых служб, которые содержатся в APK Сервисов Google Play.

Приложения Android взаимодействуют с Сервисами Google Play через клиентскую библиотеку Сервисов Google Play. Эта библиотека содержит интерфейсы и классы отдельных служб, таких как Карты. На следующей схеме показана связь между приложением Android и Сервисами Google Play.

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

API Карт для Android поставляется в составе Сервисов Google Play. Прежде чем приложение Xamarin.Android сможет использовать API Карт, необходимо установить пакет SDK Сервисов Google Play с помощью Диспетчера SDK Android. На следующем снимке экрана показано, где в Диспетчере SDK Android можно найти клиент пакета SDK Сервисов Google Play.

Google Play Services appears under Extras in the Android SDK Manager

Примечание.

APK Сервисов Google Play — это лицензированный продукт, который может быть доступен не на всех устройствах. Если он не установлен на устройстве, Карты Google работать не будут.

установить пакет Xamarin.GooglePlayServices.Maps из NuGet;

Пакет Xamarin.GooglePlayServices.Maps содержит привязки Xamarin.Android для API Карт из Сервисов Google Play. Чтобы добавить пакет Карт из Сервисов Google Play, щелкните правой кнопкой мыши папку Ссылки проекта в обозревателе решений и выберите Управление пакетами NuGet.

Solution Explorer showing Manage NuGet Packages context menu item under References

Откроется диспетчер пакетов NuGet. Щелкните Обзор и в поле поиска введите Xamarin Google Play Services Maps. Выберите Xamarin.GooglePlayServices.Maps и щелкните Установить. (Если этот пакет уже установлен, щелкните Обновить.)

NuGet Package Manager with Xamarin.GooglePlayServices.Maps package selected

Обратите внимание на то, что также будут установлены следующие пакеты зависимостей:

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

указать необходимые разрешения;

Приложения должны указать требования к оборудованию и разрешениям для использования API Карт Google. Некоторые разрешения автоматически предоставляются пакетом SDK Сервисов Google Play, и разработчику не нужно явно добавлять их в AndroidManfest.XML.

  • Доступ к сетевому состоянию — API Карты должен иметь возможность проверка, если он может скачать плитки карты.

  • Доступ к Интернету — доступ к Интернету необходим для скачивания плиток карты и взаимодействия с серверами Google Play для доступа к API.

Следующие разрешения и компоненты должны быть указаны в AndroidManifest.XML для API Карт Google для Android.

  • OpenGL ES версии 2 . Приложение должно объявить требование для OpenGL ES версии 2.

  • Ключ API Google Карты — ключ API используется для подтверждения регистрации и разрешения приложения на использование служб Google Play. Дополнительные сведения об этом ключе см. в разделе Получение ключа API Google Maps.

  • Запросить устаревший клиент Apache HTTP — приложения, предназначенные для Android 9.0 (уровень API 28) или более поздней версии, должны указать, что устаревший клиент Apache HTTP является необязательной библиотекой для использования.

  • Доступ к веб-службам Google— приложению требуются разрешения на доступ к веб-службам Google, которые возвращают API android Карты.

  • Разрешения для уведомлений служб Google Play. Приложение должно быть предоставлено разрешение на получение удаленных уведомлений из служб Google Play.

  • Доступ к поставщикам расположений— это необязательные разрешения. Они позволяют классу GoogleMap отображать расположение устройства на карте.

Кроме того, в Android 9 клиентская библиотека Apache HTTP удалена из bootclasspath, поэтому она недоступна для приложений, нацеленных на уровень API 28 или более поздней версии. Чтобы продолжить использование HTTP-клиента Apache в приложениях, нацеленных на уровень API 28 или более поздней версии, необходимо добавить приведенную ниже строку в узел application файла AndroidManifest.XML.

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

Примечание.

Самые старые версии пакета SDK для Google Play требовали, чтобы приложение запрашивало разрешение WRITE_EXTERNAL_STORAGE. Это требование не распространяется на последние привязки Xamarin для Сервисов Google Play.

В следующем фрагменте кода приведен пример параметров, которые необходимо добавить в 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>

Помимо запроса разрешений AndroidManifest.XML, приложение также должно выполнять разрешения среды выполнения проверка для ACCESS_COARSE_LOCATION разрешений и ACCESS_FINE_LOCATION разрешений. Дополнительные сведения о выполнении проверок разрешений во время выполнения см. в руководстве по управлению разрешениями Xamarin.Android.

Создание эмулятора с помощью API Google

В случае, если физическое устройство Android с Сервисами Google Play отсутствует, можно создать образ эмулятора для разработки. Дополнительные сведения см. в статье Диспетчер устройств.

Класс GoogleMap

После выполнения необходимых условий можно приступить к разработке приложения и использовать API Карт для Android. Класс GoogleMap — это основной API, который приложение Xamarin.Android будет использовать для отображения Карт Google для Android и взаимодействия с ними. Этот класс отвечает за выполнение следующих задач.

  • Взаимодействие с Сервисами Google Play для авторизации приложения с помощью веб-службы Google.

  • Скачивание, кэширование и отображение фрагментов карты.

  • Отображение для пользователя элементов управления пользовательского интерфейса, таких как сдвиг и масштабирование.

  • Отображение маркеров и геометрических фигур на картах.

GoogleMap добавляется в действие одним из двух способов.

  • MapFragment. MapFragment — это специализированный объект Fragment, который используется для размещения объекта GoogleMap. Для MapFragment требуется уровень API для Android 12 или более поздняя версия. Более старые версии Android могут использовать SupportMapFragment. В этом руководством основное внимание уделяется использованию класса MapFragment.

  • MapView. MapView — это специализированный подкласс View, который может использоваться для размещения объекта GoogleMap. Пользователи этого класса должны пересылать все методы жизненного цикла действия в класс MapView.

Каждый из этих контейнеров предоставляет свойство Map, которое возвращает экземпляр GoogleMap. Следует отдавать предпочтение классу MapFragment, так как это более простой API, уменьшающий объем стандартного кода, который разработчику необходимо реализовать вручную.

Добавление MapFragment в действие

На следующем снимке экрана показан пример простого MapFragment.

Screenshot of a device displaying a Google Map fragment

Как и для других классов Fragment, существуют два способа добавления MapFragment в действие.

  • Декларативно. MapFragment можно добавить с помощью XML-файла макета для действия. В приведенном ниже фрагменте XML демонстрируется использование элемента fragment.

    <?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" />
    
  • Программно. Экземпляр MapFragment можно создать программно с помощью метода MapFragment.NewInstance, а затем добавить в действие. В этом фрагменте кода показан самый простой способ создания объекта MapFragment и его добавления в действие.

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

    Объект MapFragment можно настроить, передав объект GoogleMapOptions в NewInstance. Это описано в разделе Свойства GoogleMap далее в этом руководстве.

Метод MapFragment.GetMapAsync используется для инициализации GoogleMap, размещенного во фрагменте, и для получения ссылки на объект Map, размещенный в MapFragment. Этот метод принимает объект, реализующий интерфейс IOnMapReadyCallback.

Этот интерфейс содержит один метод, IMapReadyCallback.OnMapReady(MapFragment map), который будет вызываться, когда приложение может взаимодействовать с объектом GoogleMap. В следующем фрагменте кода показано, как действие Android может инициализировать MapFragment и реализовать интерфейс IOnMapReadyCallback.

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.
    }
}

Типы карт

В API Карт Google доступны пять различных типов карт.

  • Обычная — это тип карты по умолчанию. На ней показаны дороги и важные топографические особенности, а также некоторые искусственные точки интереса (например, здания и мосты).

  • Спутниковая — на этой карте показаны фотографии со спутников.

  • Гибридная — на этой карте показаны фотографии со спутников и карты дорог.

  • Ландшафтная — на этой карте главным образом показаны топографические особенности и некоторые дороги.

  • Нет — для этой карты не загружаются какие-либо фрагменты, она отображается как пустая сетка.

На рисунке ниже показаны три различных типа карты: слева направо (обычная, гибридная, ландшафтная).

Three map example screenshots: Normal, Hybrid, and Terrain

Свойство GoogleMap.MapType используется для задания или изменения отображаемого типа карты. В следующем фрагменте кода показано, как отобразить спутниковую карту.

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

Свойства GoogleMap

GoogleMap определяет несколько свойств, которые позволяют управлять функциональностью и внешним видом карты. Одним из способов настройки начального состояния GoogleMap является передача объекта GoogleMapOptions при создании MapFragment. В следующем фрагменте кода представлен один из примеров использования объекта GoogleMapOptions при создании 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();

Другим способом настройки GoogleMap является управление свойствами UiSettings объекта Map. В следующем примере кода показано, как настроить GoogleMap для отображения элементов управления масштабом и компаса.

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

Взаимодействие с GoogleMap

API Карт для Android предоставляет интерфейсы API, позволяющие действию изменять перспективу, добавлять маркеры, размещать пользовательские наложения или отображать геометрические фигуры. В этом разделе рассказывается, как выполнить некоторые из этих задач в Xamarin.Android.

Изменение перспективы

Карты моделируются в виде плоской поверхности и отображаются на экране на основе проекции Меркатора. Представление карты — это камера, направленная строго сверху на эту поверхность. Положением камеры можно управлять, изменяя расположение, масштаб, наклон и азимут. Класс CameraUpdate используется для изменения расположения камеры. Экземпляры объектов CameraUpdate не создаются напрямую. Вместо этого API Карт предоставляет класс CameraUpdateFactory.

После создания объекта CameraUpdate он передается в качестве параметра в метод GoogleMap.MoveCamera или GoogleMap.AnimateCamera. Метод MoveCamera мгновенно обновляет карту, а метод AnimateCamera обеспечивает плавный анимированный переход.

Этот фрагмент кода демонстрирует простой пример того, как использовать CameraUpdateFactory для создания CameraUpdate, увеличивающего уровень масштаба на единицу.

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

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

API Карт предоставляет класс CameraPosition, который будет объединять все возможные значения расположения камеры. Экземпляр этого класса может быть предоставлен методу CameraUpdateFactory.NewCameraPosition, который возвращает объект CameraUpdate. API Карт также содержит класс CameraPosition.Builder, предоставляющий текучий API для создания объектов CameraPosition. В следующем фрагменте кода показан пример создания CameraUpdate из CameraPosition и его использования для изменения расположения камеры на 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);
}

В предыдущем фрагменте кода определенное расположение на карте представлено классом LatLng. Уровень масштаба равен 18, что является произвольным значением масштаба, используемым в Картах Google. Азимут — это показания компаса, измеряемые по часовой стрелке от направления на север. Свойство Tilt управляет углом обзора и задает угол в 25 градусов от вертикали. На следующем снимке экрана показан GoogleMap после выполнения предыдущего кода.

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

Отображение на карте

API Карт для Android предоставляет API для отображения следующих элементов на карте:

  • маркеры — это специальные значки, используемые для указания отдельного расположения на карте;

  • наложения — это изображения, с помощью которых на карте можно указать коллекцию расположений или область;

  • линии, многоугольники и окружности — это интерфейсы API, позволяющие действиям добавлять фигуры на карту.

Маркеры

API Карт предоставляет класс Marker, который инкапсулирует все данные об отдельном расположении на карте. По умолчанию класс Marker использует стандартный значок, предоставляемый Картами Google. Можно настроить внешний вид маркера и его реагирование на щелчки пользователя.

Добавление маркера

Чтобы добавить маркер на карту, необходимо создать объект MarkerOptions, а затем вызвать метод AddMarker для экземпляра GoogleMap. Этот метод вернет объект Marker.

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

    map.AddMarker(markerOpt1);
}

Заголовок маркера будет отображаться в окне сведений, когда пользователь коснется маркера. На следующем снимке экрана показано, как выглядит этот маркер.

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

Настройка маркера

Можно настроить значок, используемый маркером, вызвав метод MarkerOptions.InvokeIcon при добавлении маркера на карту. Этот метод принимает объект BitmapDescriptor, содержащий данные, необходимые для отображения значка. Класс BitmapDescriptorFactory предоставляет несколько вспомогательных методов, упрощающих создание BitmapDescriptor. Ниже перечислены некоторые из этих методов.

  • DefaultMarker(float colour)— Используйте маркер Google Карты по умолчанию, но измените цвет.

  • FromAsset(string assetName) — используйте пользовательский значок из указанного файла в папке "Активы".

  • FromBitmap(Bitmap image) — используйте указанную растровую карту в качестве значка.

  • FromFile(string fileName) — создайте настраиваемый значок из файла по указанному пути.

  • FromResource(int resourceId) — создайте пользовательский значок из указанного ресурса.

В следующем фрагменте кода показан пример создания маркера по умолчанию голубого цвета.

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);
}

Окна сведений

Окна сведений — это специальные всплывающие окна, которые отображают сведения для пользователя при касании определенного маркера. По умолчанию в окне сведений отображается содержимое заголовка маркера. Если заголовок не назначен, окно сведений не отображается. Одновременно может отображаться только одно окно сведений.

Окно сведений можно настроить, реализовав интерфейс GoogleMap.IInfoWindowAdapter. В этом интерфейсе доступны два важных метода.

  • public View GetInfoWindow(Marker marker) — Этот метод вызывается для получения пользовательского окна сведений для маркера. Если возвращается значение null, будет использоваться метод отображения окна по умолчанию. Если возвращается объект View, то этот объект будет помещен внутрь рамки окна сведений.

  • public View GetInfoContents(Marker marker) — Этот метод будет вызываться только в том случае, если возвращается null GetInfoWindow. Этот метод может возвращать значение null, если должно использоваться применяемое по умолчанию отображение содержимого окна сведений. В противном случае этот метод должен возвращать объект View с содержимым окна сведений.

Окно сведений не является динамическим представлением. Вместо этого Android преобразовывает объект View в статическое растровое изображение и показывает его на изображении. Это означает, что окно сведений не может реагировать на события касания или жесты, а его содержимое не будет автоматически обновляться. Чтобы обновить окно сведений, необходимо вызвать метод GoogleMap.ShowInfoWindow.

На следующем рисунке показано несколько примеров настраиваемых окон сведений. Слева показано изображение с настроенным содержимым, а справа — изображение, на котором для окна с содержимым настроены скругленные углы.

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

Объекты GroundOverlay

В отличие от маркеров, указывающих определенное расположение на карте, GroundOverlay — это изображение, которое используется для указания коллекции расположений или области на карте.

Добавление GroundOverlay

Добавление наземного наложения на карту аналогично добавлению маркера. Сначала создается объект GroundOverlayOptions. Затем этот объект передается в качестве параметра в метод GoogleMap.AddGroundOverlay, который возвращает объект GroundOverlay. Этот фрагмент кода является примером добавления наземного наложения на карту.

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

На следующем снимке экрана показано. как это наложение выглядит на карте.

Example map with an overlayed image of a polar bear

Линии, окружности и многоугольники

Существуют три простых типа геометрических фигур, которые можно добавить на карту. Они перечислены ниже.

  • Ломаная линия — это ряд соединенных сегментов линии. Она может отмечать путь на карте или образовывать геометрическую фигуру.

  • Окружность — на карте будет нарисована окружность.

  • Многоугольник — это замкнутая фигура, позволяющая обвести области на карте.

Ломаные линии

Ломаная линия — это список последовательных объектов LatLng, которые определяют вершины каждого сегмента линии. Чтобы создать ломаную линию, сначала нужно создать объект PolylineOptions и добавить в него точки. Затем объект PolylineOption передается в объект GoogleMap путем вызова метода AddPolyline.

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);
Окружности

Окружности создаются путем создания объекта CircleOption, который определяет центр и радиус окружности в метрах. Окружность рисуется на карте путем вызова GoogleMap.AddCircle. В следующем фрагменте кода показано, как нарисовать окружность.

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

googleMap.AddCircle (circleOptions);
многоугольники

Объекты Polygon похожи на объекты Polyline, за исключением того, что они замкнутые. Polygons является закрытым циклом и их интерьер заполнен. Polygons создаются точно так же, как Polylineи метод GoogleMap.AddPolygon.

В отличие от объектов Polyline, объекты Polygon являются замкнутыми. Многоугольник замыкается методом AddPolygon, который соединяет линией первую и последнюю точки. В следующем фрагменте кода создается закрашенный прямоугольник в области, использованной в предыдущем фрагменте кода с примером 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);

Реагирование на события пользователя

Существуют три типа взаимодействия пользователя с картой:

  • щелчок маркера — пользователь щелкает маркер;

  • перетаскивание маркера — пользователь касается маркера и не отпускает его;

  • щелчок окна сведений — пользователь щелкает окно сведений.

Каждое из этих событий будет рассмотрено более подробно ниже.

События щелчка маркера

Событие MarkerClicked возникает при касании маркера пользователем. Это событие принимает объект GoogleMap.MarkerClickEventArgs в качестве параметра. Этот класс содержит два свойства.

  • GoogleMap.MarkerClickEventArgs.Handled — Это свойство должно быть задано, true чтобы указать, что обработчик событий использовал событие. Если для этого свойства задано значение false, то в дополнение к пользовательскому поведению обработчика событий будет выполнено поведение по умолчанию.

  • Marker — Это свойство является ссылкой на маркер, который вызвал MarkerClick событие.

В этом фрагменте кода показан пример MarkerClick, который изменит положение камеры на карте.

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();
    }
}

События перетаскивания маркера

Это событие возникает, когда пользователь перетаскивает маркер. По умолчанию маркеры невозможно перетаскивать. Маркер можно сделать перетаскиваемым, присвоив свойству Marker.Draggable значение true или вызвав метод MarkerOptions.Draggable, указав true в качестве параметра.

Чтобы перетащить маркер, пользователь должен щелкнуть маркер и не отнимать палец от карты. Когда пользователь проведет этим пальцем по экрану, маркер последует за ним. Когда пользователь отнимет палец от экрана, маркер останется на выбранном месте.

Ниже перечислены различные события, которые будут создаваться для перетаскиваемого маркера.

  • GoogleMap.MarkerDragStart(object sender, GoogleMap.MarkerDragStartEventArgs e) — Это событие возникает, когда пользователь сначала перетаскивает маркер.

  • GoogleMap.MarkerDrag(object sender, GoogleMap.MarkerDragEventArgs e) — Это событие возникает по мере перетаскивания маркера.

  • GoogleMap.MarkerDragEnd(object sender, GoogleMap.MarkerDragEndEventArgs e) — Это событие возникает, когда пользователь завершит перетаскивание маркера.

Каждый EventArgs содержит одно свойство P0, которое является ссылкой на перетаскиваемый объект Marker.

События щелчка окна сведений

Одновременно может отображаться только одно окно сведений. Когда пользователь щелкает окно сведений на карте, объект Map создает событие InfoWindowClick. В следующем фрагменте кода показано, как подключить обработчик к событию.

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

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

Помните, что окно сведений является статическим объектом View, отображаемым на карте в виде картинки. Любые мини-приложения, такие как кнопки, флажки или текстовые представления, помещенные в окно сведений, будут статичны и не будут реагировать на какие-либо связанные события пользователя.