Все готово!

Прежде чем приступить к разработке, ознакомьтесь с документацией для разработчиков.

Активация Google Maps Android API

Чтобы помочь вам освоиться, мы покажем, как выполнить некоторые необходимые действия в консоли разработчика Google:

  1. Создание или выбор проекта
  2. Активация Google Maps Android API
  3. Создание соответствующих ключей

Маркеры

Маркеры обозначают отдельные местоположения на карте. Вы можете настраивать свои маркеры, изменяя цвет, установленный по умолчанию, или указывая собственное изображение вместо стандартного значка маркера. Информационные окна могут содержать дополнительный контекст для маркера.

Примеры кода

Репозиторий ApiDemos на сайте GitHub содержит пример, который демонстрирует различные свойства маркера:

Введение

Маркеры указывают местоположения на карте. Маркер по умолчанию использует стандартный значок, соответствующий внешнему виду и функциям Google Maps. С помощью API можно изменить цвет значка, его изображение или точку привязки. Маркеры представляют собой объекты типа Marker и добавляются на карту с помощью метода GoogleMap.addMarker(markerOptions).

Маркеры предназначены для интерактивного взаимодействия. По умолчанию они принимают события click и часто используются с блоками прослушивания событий для вывода информационных окон. Установка для свойства маркера draggable значения true позволяет пользователю изменять положение маркера на карте. Возможность перемещения маркера активируется долгим нажатием.

По умолчанию, когда пользователь касается маркера, в нижнем правом углу карты отображается панель инструментов, которая предоставляет быстрый доступ к мобильному приложению Google Maps. Эту панель инструментов можно отключить. Дополнительные сведения см. в руководстве по элементам управления.

Начало работы с маркерами

В этом эпизоде Maps Live рассказывается об основах добавления маркеров на карту с использованием Google Maps Android API.

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

В следующем примере демонстрируется добавление маркера на карту. Маркер создается в точке с координатами 10,10 и после нажатия отображает строку "Hello World" в информационном окне.

@Override
public void onMapReady(GoogleMap map) {
    map.addMarker(new MarkerOptions()
        .position(new LatLng(10, 10))
        .title("Hello world"));
}

Отображение дополнительной информации о маркере

Отображение дополнительной информации о месте или местоположении при касании карты пользователем является стандартным требованием. См. руководство пo информационным окнам.

Привязка данных к маркеру

В маркере можно сохранить произвольный объект данных, используя метод Marker.setTag(), и извлечь этот объект данных с помощью метода Marker.getTag(), как показано в данном примере кода:

/**
 * A demo class that stores and retrieves data objects with each marker.
 */
public class MarkerDemoActivity extends FragmentActivity implements
        OnMarkerClickListener,
        OnMapReadyCallback {

    private static final LatLng PERTH = new LatLng(-31.952854, 115.857342);
    private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
    private static final LatLng BRISBANE = new LatLng(-27.47093, 153.0235);

    private Marker mPerth;
    private Marker mSydney;
    private Marker mBrisbane;

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.marker_demo);

        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    /** Called when the map is ready. */
    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;

        // Add some markers to the map, and add a data object to each marker.
        mPerth = mMap.addMarker(new MarkerOptions()
                .position(PERTH)
                .title("Perth");
        mPerth.setTag(0);

        mSydney = mMap.addMarker(new MarkerOptions()
                .position(SYDNEY)
                .title("Sydney");
        mSydney.setTag(0);

        mBrisbane = mMap.addMarker(new MarkerOptions()
                .position(BRISBANE)
                .title("Brisbane");
        mBrisbane.setTag(0);

        // Set a listener for marker click.
        mMap.setOnMarkerClickListener(this);
    }

    /** Called when the user clicks a marker. */
    @Override
    public boolean onMarkerClick(final Marker marker) {

        // Retrieve the data from the marker.
        Integer clickCount = (Integer) marker.getTag();

        // Check if a click count was set, then display the click count.
        if (clickCount != null) {
            clickCount = clickCount + 1;
            marker.setTag(clickCount);
            Toast.makeText(this,
                           marker.getTitle() +
                           " has been clicked " + clickCount + " times.",
                           Toast.LENGTH_SHORT).show();
        }

        // Return false to indicate that we have not consumed the event and that we wish
        // for the default behavior to occur (which is for the camera to move such that the
        // marker is centered and for the marker's info window to open, if it has one).
        return false;
    }
}

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

  • Ваше приложение может обрабатывать различные типы маркеров, но требуется, чтобы они обрабатывались по-разному, когда пользователь нажимает на них. Для достижения этого, можно сохранить String, используя маркер с указанием его типа.
  • Возможно взаимодействие с системой, в которой имеются уникальные идентификаторы записей, где маркеры представляют собой особые записи.
  • Данные маркера могут указывать на приоритет при определении параметра z-index маркера.

Перетаскивание маркера

После добавления маркера на карту его можно переместить в другое место при условии, что для его свойства draggable указано значение true. Перетаскивание маркера активируется долгим нажатием. Когда пользователь уберет палец с экрана, маркер останется в этом месте.

По умолчанию возможность перетаскивания маркеров отключена. Вы должны явно включить эту возможность либо с помощью MarkerOptions.draggable(boolean) до добавления маркера на карту, либо с помощью Marker.setDraggable(boolean), когда маркер уже установлен на карте. Вы можете отслеживать события перетаскивания для маркера, как это описано в разделе События перетаскивания маркера.

В приведенном ниже фрагменте кода перетаскиваемый маркер устанавливается для города Перт (Австралия).

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .draggable(true));

Изменение маркера

В этом видеоролике рассказывается об использовании маркеров для визуального представления различных мест на карте.

Для маркера можно определить собственное изображение, отображаемое вместо стандартного значка. При определении значка устанавливается ряд свойств, влияющих на визуальное поведение маркера.

Маркеры поддерживают настройку с использованием следующих свойств.

Position (обязательное свойство)
Значение LatLng для позиции маркера на карте. Это единственное обязательное свойство для объекта Marker.
Anchor
Точка на изображении, которое будет установлено в месте, указанном параметром маркера LatLng (широта и долгота). По умолчанию устанавливается по центру в нижней части изображения.
Alpha
Устанавливает непрозрачность маркера. По умолчанию установлено значение 1.0.
Title
Строка, которая отображается в информационном окне, когда пользователь касается маркера.
Snippet
Дополнительный текст, который отображается под заголовком.
Значок
Растровое изображение, которое отображается вместо стандартного изображения маркера.
Draggable
Установите значение true для этого свойства, если вы хотите разрешить пользователю перемещать маркер. По умолчанию установлено значение false.
Visible
Установите значение false для этого свойства, чтобы сделать маркер невидимым. По умолчанию установлено значение true.
Плоская или афишная ориентация
По умолчанию маркеры ориентированы по экрану и не изменяют своего направления при вращении или наклоне камеры. Плоские маркеры ориентированы по земной поверхности и вращаются или наклоняются вместе с камерой. Маркеры обоих типов не меняют размер при масштабировании. Если вам необходим этот эффект, используйте GroundOverlays.
Rotation
Направление маркера, указываемое в градусах по часовой стрелке. Для плоских маркеров направление по умолчанию может изменяться. По умолчанию плоский маркер направлен на север. Если маркер не плоский, то по умолчанию он направлен вверх, а при вращении он всегда направлен в сторону камеры.

Приведенный ниже фрагмент кода создает простой маркер со стандартным значком.

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE));

Изменение цвета маркера

Чтобы изменить цвет стандартного изображения маркера, необходимо передать объект BitmapDescriptor в метод icon(). Вы можете использовать набор предварительно установленных цветов в объекте BitmapDescriptorFactory или набор собственных цветов маркера в методе BitmapDescriptorFactory.defaultMarker(float hue). Оттенок – это значение между 0 и 360, представляющее точки на цветовом круге.

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

Изменение непрозрачности маркера

Для изменения непрозрачности маркера можно использовать метод MarkerOptions.alpha(). Параметр alpha должен быть указан как число с плавающей точкой между 0.0 и 1.0, где 0 соответствует полностью прозрачному маркеру, а 1 – полностью непрозрачному.

static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
Marker melbourne = mMap.addMarker(new MarkerOptions()
                          .position(MELBOURNE)
                          .alpha(0.7f));

Изменение изображения маркера

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

fromAsset(String assetName)
Создает собственный маркер, используя название растрового изображения в каталоге ресурсов.
fromBitmap(Bitmap image)
Создает собственный маркер из растрового изображения.
fromFile(String fileName)
Создает собственный значок, используя имя растрового файла, расположенного во внутреннем хранилище.
fromPath(String absolutePath)
Создает собственный маркер по абсолютному пути к растровому файлу.
fromResource(int resourceId)
Создает собственный маркер, используя идентификатор ресурса растрового изображения.

В приведенном ниже фрагменте показано создание маркера с собственным значком.

  private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
  private Marker melbourne = mMap.addMarker(new MarkerOptions()
                            .position(MELBOURNE)
                            .title("Melbourne")
                            .snippet("Population: 4,137,400")
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

Создание плоского маркера

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

Чтобы изменить ориентацию маркера, необходимо для свойства flat указать значение true.

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .flat(true));

Вращение маркера

Вы можете поворачивать маркер вокруг его точки привязки с помощью метода Marker.setRotation(). Поворот измеряется в градусах по часовой стрелке от направления по умолчанию. Если маркер плоский относительно карты, в качестве направления по умолчанию используется север. Если маркер не плоский, то по умолчанию он направлен вверх, а при вращении он всегда направлен в сторону камеры.

В приведенном ниже примере маркер поворачивается на 90°. При установке для точки привязки значения 0.5,0.5 маркер будет вращаться вокруг своего центра, а не вокруг своего основания.

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker perth = mMap.addMarker(new MarkerOptions()
                          .position(PERTH)
                          .anchor(0.5,0.5)
                          .rotation(90.0));

Z-index маркера

Параметр Z-index указывает порядок расположения этого маркера относительно других маркеров на карте. Маркер с высоким Z-index отображается поверх маркеров с меньшими значениями Z-index. По умолчанию значение параметра z-index равно 0.

Установите Z-index на объект параметров маркера, вызвав метод MarkerOptions.zIndex(), как показано в следующем примере кода:

@Override
public void onMapReady(GoogleMap map) {
    map.addMarker(new MarkerOptions()
        .position(new LatLng(10, 10))
        .title("Marker z1")
        .zIndex(1.0f));
}

Доступ к параметру Z-index маркера осуществляется вызовом методаMarker.getZIndex(). А изменить его можно вызовом методаMarker.setZIndex().

Маркеры всегда отображаются поверх мозаичных слоев и прочих не поддерживающих маркеры наложений (наземных наложений, ломаных линий, многоугольников и прочих фигур) вне зависимости от значения Z-index других слоев. Маркеры фактически считаются отдельной группой значений Z-index относительно других слоев.

Читайте ниже о влиянии z-index на события нажатия.

Обработка событий маркера

Maps API позволяет отслеживать события маркера и реагировать на них. Чтобы отслеживать эти события, установите соответствующий блок прослушивания для объекта GoogleMap, которому принадлежат маркеры. Если для одного из маркеров карты возникает событие, выполняется обратный вызов блока прослушивания с соответствующим объектом Marker, передаваемым в виде параметра. Чтобы сравнить этот объект Marker со своей ссылкой на объект Marker, необходимо использовать equals(), а не ==.

Вы можете отслеживать следующие события:

События нажатия маркера

Вы можете использовать OnMarkerClickListener, чтобы отслеживать события нажатия маркера. Чтобы установить этот блок прослушивания на карте, вызовите GoogleMap.setOnMarkerClickListener(OnMarkerClickListener). Когда пользователь нажимает маркер, выполняется вызов onMarkerClick(Marker), а маркер передается в виде аргумента. Этот метод возвращает логическое значение, которое указывает, обработали ли вы это событие (то есть, вы хотите отказаться от использования поведения по умолчанию). Если он вернет false, то дополнительно к выбранному вами поведению будет использовано поведение по умолчанию. Поведение по умолчанию для нажатия маркера – отображение его информационного окна (если оно доступно) и перемещение камеры таким образом, чтобы маркер находился в центре карты.

Влияние Z-index на события нажатия:

  • Когда пользователь нажимает кластер маркеров, событие нажатия назначается маркеру с наивысшим Z-index.
  • В большинстве случаев каждое нажатие запускает одно событие. Другими словами, нажатие не передается маркерам или иным наложениям с более низкими значениями z-index.
  • Нажатие кластера маркеров вызывает последующий цикл нажатий внутри кластера, выбирая каждый маркер по очереди. Порядок в цикле имеет приоритет прежде всего по Z-index, и только затем – по приближению к точке нажатия.
  • Если пользователь нажимает за пределами кластера, API пересчитывает кластер и переопределяет состояние цикла нажатий, запуская его сначала.
  • Событие нажатия переходит от кластера маркеров на другие фигуры и наложения, прежде чем цикл начнется снова.
  • Маркеры фактически считаются отдельной группой значений Z-index относительно других слоев и фигур (ломаных линий, многоугольников, окружностей, наземных наложений), вне зависимости от значения Z-index других слоев. Если несколько маркеров, наложений или фигур накладываются поверх друг друга, тогда нажатия сначала циклически распределяются по кластеру маркеров, а затем применяются для других, доступных для нажатия наложений или фигур в зависимости от значений их параметра z-index.

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

Вы можете использовать OnMarkerDragListener, чтобы отслеживать события перетаскивания маркера. Чтобы установить этот блок прослушивания на карте, вызовите GoogleMap.setOnMarkerDragListener. Чтобы переместить маркер, пользователь должен использовать долгое нажатие маркера. Когда пользователь уберет палец с экрана, маркер останется в этом месте. При перетаскивании маркера сначала вызывается метод onMarkerDragStart(Marker). Во время перетаскивания маркера выполняется постоянный вызов onMarkerDrag(Marker). По окончании перетаскивания вызывается onMarkerDragEnd(Marker). Положение маркера можно получить в любой момент, вызвав Marker.getPosition().

Примечание. По умолчанию перетаскивание маркера отключено. Чтобы пользователь мог перетаскивать маркер, необходимо явным образом установить это свойство маркера. Это можно сделать либо с помощью MarkerOptions.draggable(boolean) до добавления маркера на карту, либо используя Marker.setDraggable(boolean), когда он уже установлен на карте.

Оставить отзыв о...

Текущей странице
Google Maps Android API
Google Maps Android API
Нужна помощь? Обратитесь в службу поддержки.