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:
- EventsDemoActivity: eventos de cambio de cámara y clic en el mapa
- CameraDemoActivity: eventos de cambio de cámara
- CircleDemoActivity: eventos de arrastre y clic en marcadores
- GroundOverlayDemoActivity: eventos de clic en superposiciones de suelo
- IndoorDemoActivity: eventos de mapa de interiores
- MarkerDemoActivity: eventos de ventana de información y marcador
- PolygonDemoActivity: eventos de polígono
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 escuchaOnCameraMoveStartedListener
. 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 escuchaOnCameraMoveListener
. 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 llamadaonCameraMove()
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 escuchaOnCameraIdleListener
.Cuando se interrumpe el movimiento actual de la cámara, se invoca la devolución de llamada
OnCameraMoveCanceled()
del objeto de escuchaOnCameraMoveCanceledListener
. Inmediatamente después de la devolución de llamadaOnCameraMoveCanceled()
, se invoca la devolución de llamadaonCameraMoveStarted()
con el nuevo motivo (reason
).Si tu app llama explícitamente a
GoogleMap.stopAnimation()
, se invocará la devolución de llamadaOnCameraMoveCanceled()
, pero no la devolución de llamadaonCameraMoveStarted()
.
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:
- Si el usuario hace clic en el botón Mi ubicación, tu app recibirá una devolución de llamada
onMyLocationButtonClick()
del objeto de escuchaGoogleMap.OnMyLocationButtonClickListener
. - Si el usuario hace clic en el punto azul de Mi ubicación, tu app recibirá una devolución de llamada
onMyLocationClick()
del objeto de escuchaGoogleMap.OnMyLocationClickListener
.
Para obtener más detalles, consulta la guía sobre la capa Mi ubicación.