События

С помощью Maps SDK for Android вы можете отслеживать события на карте.

Примеры кода

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

События клика и длительного клика

Чтобы приложение реагировало на нажатие в определенной точке карты, используйте прослушиватель OnMapClickListener, который устанавливается с помощью метода GoogleMap.setOnMapClickListener(OnMapClickListener). Когда пользователь нажимает на карту, инициируется событие onMapClick(LatLng), сообщающее координаты точки, в которой произошел клик. Если вам требуются координаты соответствующей точки на экране в пикселях, вы можете запросить объект Projection. Он позволяет переводить широту и долготу в координаты экрана в пикселях.

Кроме того, вы можете отслеживать длительные нажатия с помощью интерфейса OnMapLongClickListener. Чтобы добавить его на карту, вызовите GoogleMap.setOnMapLongClickListener(OnMapLongClickListener). Этот прослушиватель работает так же, как прослушиватель обычных кликов. При обнаружении долгого нажатия инициируется метод обратного вызова onMapLongClick(LatLng).

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

Чтобы отключить события кликов на карте в упрощенном режиме, вызовите метод setClickable() в представлении, которое содержит MapView или MapFragment. Это применяется, например, при отображении одной или нескольких карт в представлении в виде списка, когда вам необходимо, чтобы клик вызывал действие, не имеющее отношения к карте.

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

Для MapView:

MapView view;
...
view.setClickable(false);

Для MapFragment:

MapFragment fragment;
...
fragment.getView().setClickable(false);

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

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

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

Следующий образец демонстрирует все доступные прослушиватели для событий камеры:

public class MyCameraActivity extends FragmentActivity implements
        OnCameraMoveStartedListener,
        OnCameraMoveListener,
        OnCameraMoveCanceledListener,
        OnCameraIdleListener,
        OnMapReadyCallback {

    private GoogleMap mMap;

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

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

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;

        mMap.setOnCameraIdleListener(this);
        mMap.setOnCameraMoveStartedListener(this);
        mMap.setOnCameraMoveListener(this);
        mMap.setOnCameraMoveCanceledListener(this);

        // Show Sydney on the map.
        mMap.moveCamera(CameraUpdateFactory
                .newLatLngZoom(new LatLng(-33.87365, 151.20689), 10));
    }

    @Override
    public void onCameraMoveStarted(int reason) {

        if (reason == OnCameraMoveStartedListener.REASON_GESTURE) {
            Toast.makeText(this, "The user gestured on the map.",
                           Toast.LENGTH_SHORT).show();
        } else if (reason == OnCameraMoveStartedListener
                                .REASON_API_ANIMATION) {
            Toast.makeText(this, "The user tapped something on the map.",
                           Toast.LENGTH_SHORT).show();
        } else if (reason == OnCameraMoveStartedListener
                                .REASON_DEVELOPER_ANIMATION) {
            Toast.makeText(this, "The app moved the camera.",
                           Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onCameraMove() {
        Toast.makeText(this, "The camera is moving.",
                       Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCameraMoveCanceled() {
        Toast.makeText(this, "Camera movement canceled.",
                       Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCameraIdle() {
        Toast.makeText(this, "The camera has stopped moving.",
                       Toast.LENGTH_SHORT).show();
    }
}

Предусмотрены следующие прослушиватели камеры:

  • Обратный вызов метода onCameraMoveStarted() для прослушивателя OnCameraMoveStartedListener выполняется, когда камера начинает движение. Метод обратного вызова получает константу reason, указывающую причину движения камеры. Причина может быть одной из следующих:

    • REASON_GESTURE указывает, что камера начала движение в ответ на жест пользователя на карте, такой как панорамирование, наклон, вращение карты, сведение или разведение пальцев для масштабирования.
    • REASON_API_ANIMATION указывает, что API вызвал движение камеры в ответ на действие пользователя, не связанное с жестами, такое как нажатие кнопки масштабирования, кнопки "Мое местоположение" или касание маркера.
    • REASON_DEVELOPER_ANIMATION указывает, что движение камеры инициировано приложением.
  • Обратный вызов метода onCameraMove() для прослушивателя OnCameraMoveListener выполняется несколько раз во время движения камеры или при действиях пользователя на сенсорном экране. Полезно знать, что API выполняет обратный вызов один раз для каждого фрейма. Тем не менее обратите внимание, что этот обратный вызов выполняется асинхронно и, следовательно, не будет синхронизирован с текущим отображением экрана. Кроме того, следует учитывать, что камера может не изменять свое положение между двумя обратными вызовами метода onCameraMove().

  • Обратный вызов метода OnCameraIdle() для прослушивателя OnCameraIdleListener происходит, когда камера прекращает движение, а пользователь не выполняет никаких действий с картой.

  • Обратный вызов метода OnCameraMoveCanceled() для прослушивателя OnCameraMoveCanceledListener происходит, когда текущее движение камеры было прервано. Сразу же после обратного вызова метода OnCameraMoveCanceled() выполняется обратный вызов метода onCameraMoveStarted() с новым параметром reason.

    Если ваше приложение явным образом вызывает метод GoogleMap.stopAnimation(), выполняется обратный вызов метода OnCameraMoveCanceled(), но при этом обратный вызов onCameraMoveStarted() не происходит.

Чтобы добавить прослушиватель на карту, необходимо вызвать соответствующий метод. Например, для запроса обратного вызова из прослушивателя OnCameraMoveStartedListener вызовите метод GoogleMap.setOnCameraMoveStartedListener().

Вы можете получить целевой объект камеры (широту и долготу), масштаб, направление и наклон из объекта CameraPosition. Дополнительную информацию об этом вы найдете в руководстве по положению камеры.

События, связанные с организациями и другими объектами

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

Вы можете обрабатывать события кликов для объектов. Ознакомьтесь с руководством по работе с компаниями и другими объектами.

События со схемами зданий

События можно использовать для поиска и настройки активного уровня схемы здания. Используйте интерфейс OnIndoorStateChangeListener, чтобы настроить вызов прослушивателя, когда в фокус попадает новое здание или активируется новый уровень в нем.

Чтобы получить данные о здании, которое в настоящий момент находится в фокусе, вызовите GoogleMap.getFocusedBuilding(). Центрирование карты на определенной широте или долготе обычно позволяет получить информацию о здании по этим координатам, однако это не гарантируется.

После этого вы можете найти текущий активный уровень, вызвав метод IndoorBuilding.getActiveLevelIndex().

IndoorBuilding building = mMap.getFocusedBuilding();
if (building == null) {
  return null;
}
return building.getLevels().get(building.getActiveLevelIndex());

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

Подсказка. Чтобы вернуться на уровень улицы, получите уровень по умолчанию с помощью метода IndoorBuilding.getDefaultLevelIndex() и установите его в качестве активного с помощью метода IndoorLevel.activate().

События для маркера и информационного окна

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

Вы также можете отслеживать события для информационных окон.

События для форм и наложений

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

События для местоположения

Ваше приложение может реагировать на перечисленные ниже события, связанные со слоем "Мое местоположение":

  • Если пользователь нажимает кнопку "Мое местоположение", ваше приложение получает обратный вызов onMyLocationButtonClick() от прослушивателя GoogleMap.OnMyLocationButtonClickListener.
  • Если пользователь нажимает кнопку "Мое местоположение", ваше приложение получает обратный вызов onMyLocationClick() от прослушивателя GoogleMap.OnMyLocationClickListener.

Подробную информацию вы найдете в руководстве по работе со слоем "Мое местоположение".