Eventos

Con Maps SDK for Android, puedes escuchar eventos en el mapa.

Muestras de código

El repositorio ApiDemos en GitHub incluye ejemplos que muestran diversos eventos y objetos de escucha:

Eventos de clic largo y en el mapa

Si deseas responder cuando un usuario presione un punto en el mapa, puedes utilizar un objeto de escucha OnMapClickListener. Para configurarlo en el mapa, llama a GoogleMap.setOnMapClickListener(OnMapClickListener). Cuando un usuario haga clic en algún lugar del mapa (o lo presione), recibirás un evento onMapClick(LatLng) que indicará la ubicación en el mapa en la que el usuario hizo clic. Ten en cuenta que, si necesitas la ubicación correspondiente en la pantalla (en píxeles), puedes obtener una proyección (Projection) del mapa que te permita realizar conversiones entre coordenadas de latitud y longitud y coordenadas de píxeles de la pantalla.

También puedes escuchar eventos de clic largo con un objeto OnMapLongClickListener. Para configurarlo en el mapa, llama a GoogleMap.setOnMapLongClickListener(OnMapLongClickListener). Este objeto de escucha se comporta de manera similar al de clics y recibirá notificaciones de eventos de clic largo con una devolución de llamada onMapLongClick(LatLng).

Cómo inhabilitar los eventos de clic en el modo lite

Para inhabilitar los eventos de clic en un mapa en el modo lite, llama a setClickable() en la vista que contenga MapView o MapFragment. Esto resulta útil, por ejemplo, al mostrar uno o varios mapas en una vista de lista, en la que deseas que el evento de clic invoque una acción no relacionada con el mapa.

La opción para inhabilitar eventos de clic se encuentra disponible solo en el modo lite. Si inhabilitas los eventos de clic, tampoco se podrá hacer clic en los marcadores. Esto no afectará otros controles del mapa.

Para MapView, utiliza este comando:

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

Para MapFragment, utiliza este comando:

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

Eventos de cambio de cámara

La vista de mapa responde a un modelo en el cual una cámara apunta hacia abajo sobre un plano. Puedes cambiar las propiedades de la cámara para modificar el nivel de zoom, el viewport y la perspectiva del mapa. Consulta la guía de la cámara. Los usuarios también pueden modificar la cámara con gestos.

Si utilizas objetos de escucha para los cambios de cámara, podrás llevar un registro de los movimientos de la cámara. Tu app puede recibir notificaciones de eventos de inicio, continuidad y finalización de los movimientos de la cámara. También puedes ver el motivo por el que se mueve la cámara, ya sea en respuesta a gestos del usuario, animaciones de API incorporadas o movimientos controlados por el desarrollador.

En el siguiente ejemplo, se muestran todos los objetos de escucha de eventos de cámara disponibles:

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

Los siguientes objetos de escucha de cámara se encuentran disponibles:

  • Cuando la cámara comienza a moverse, se invoca la devolución de llamada onCameraMoveStarted() del objeto de escucha OnCameraMoveStartedListener. El método de devolución de llamada recibe un motivo (reason) para el movimiento de la cámara. El motivo puede ser alguno de los siguientes:

    • REASON_GESTURE indica que la cámara se movió en respuesta a un gesto del usuario en el mapa, por ejemplo, si se desplaza lateralmente por el mapa, lo inclina, lo pellizca para hacer zoom o lo rota.
    • REASON_API_ANIMATION indica que la API movió la cámara en respuesta a una acción del usuario sin gestos, por ejemplo, si presiona el botón de zoom o Mi ubicación, o bien si hace clic en un marcador.
    • REASON_DEVELOPER_ANIMATION indica que tu app inició el movimiento de la cámara.
  • Cuando la cámara está en movimiento o el usuario interactúa con la pantalla táctil, se invoca varias veces la devolución de llamada onCameraMove() del objeto de escucha OnCameraMoveListener. Para tener una idea de la cantidad de veces que se invoca la devolución de llamada, resulta útil saber que la API la invoca una vez por fotograma. Sin embargo, ten en cuenta que esa invocación es asíncrona y, por lo tanto, no se sincroniza con lo que aparece en pantalla. Además, ten presente que la posición de la cámara puede permanecer fija entre una devolución de llamada onCameraMove() y la siguiente.

  • Cuando la cámara deja de moverse y el usuario deja de interactuar con el mapa, se invoca la devolución de llamada OnCameraIdle() del objeto de escucha OnCameraIdleListener.

  • Cuando se interrumpe el movimiento actual de la cámara, se invoca la devolución de llamada OnCameraMoveCanceled() del objeto de escucha OnCameraMoveCanceledListener. Inmediatamente después de la devolución de llamada OnCameraMoveCanceled(), se invoca la devolución de llamada onCameraMoveStarted() con el nuevo motivo (reason).

    Si tu app llama explícitamente a GoogleMap.stopAnimation(), se invocará la devolución de llamada OnCameraMoveCanceled(), pero no la devolución de llamada onCameraMoveStarted().

Si deseas configurar un objeto de escucha en el mapa, llama al método correspondiente para esa función. Por ejemplo, para solicitar una devolución de llamada del objeto de escucha OnCameraMoveStartedListener, llama a GoogleMap.setOnCameraMoveStartedListener().

En CameraPosition, puedes consultar el objetivo (latitud y longitud), el zoom, el rumbo y la inclinación de la cámara. Para obtener información sobre estas propiedades, consulta la guía sobre la posición de la cámara.

Eventos en empresas y otros lugares de interés

De forma predeterminada, los lugares de interés aparecen en el Mapa base junto con sus íconos correspondientes. Los lugares de interés incluyen parques, escuelas y edificios gubernamentales, entre otros, además de lugares de interés comerciales, como tiendas, restaurantes y hoteles.

Puedes responder a eventos de clic en un lugar de interés. Consulta la guía sobre empresas y otros lugares de interés.

Eventos de mapas de interiores

Puedes utilizar eventos para encontrar y personalizar el piso activo de un mapa de interiores. Utiliza la interfaz OnIndoorStateChangeListener para configurar una llamada a un objeto de escucha al enfocar un edificio nuevo o activar un piso nuevo en un edificio.

Para conocer qué edificio está actualmente en foco, llama a GoogleMap.getFocusedBuilding(). Si centras el mapa en una latitud y longitud específicas, generalmente se te muestra el edificio que se encuentra allí. Sin embargo, esto no está garantizado.

Luego, puedes llamar a IndoorBuilding.getActiveLevelIndex() para encontrar el piso activo en ese momento.

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

Esto resulta útil si deseas mostrar un lenguaje de marcado personalizado para el piso activo, como marcadores, superposiciones de suelo, superposiciones de mosaicos, polígonos, polilíneas y otras formas.

Nota: Para volver a la planta baja, obtén el piso predeterminado a través de IndoorBuilding.getDefaultLevelIndex() y configúralo como el piso activo con IndoorLevel.activate().

Eventos de ventana de información y marcador

Puedes escuchar y responder eventos de marcador, incluidos aquellos de arrastre y clic en marcadores, si configuras el objeto de escucha correspondiente en el objeto GoogleMap al que pertenece el marcador. Consulta la guía sobre eventos de marcador.

También puedes escuchar eventos de ventana de información.

Eventos de superposición y forma

Puedes escuchar y responder eventos de clic en polilíneas, polígonos, círculos y superposiciones de suelo.

Eventos de ubicación

Tu app puede responder a los siguientes eventos relacionados con la capa Mi ubicación:

Para obtener más detalles, consulta la guía sobre la capa Mi ubicación.