En esta página, se explica con un ejemplo cómo agregar un mapa 3D básico a una app para Android con el SDK de Maps 3D para Android. En las instrucciones de esta página, se da por sentado que ya completaste los pasos de la página Configuración y que tienes lo siguiente:
- Un proyecto de Google Cloud con el SDK de Maps 3D para Android habilitado
- Una clave de API configurada para usar con el SDK de Maps 3D para Android
- Un proyecto de Android Studio configurado para usarlo con el SDK de Maps 3D para Android
Para obtener más información sobre estos requisitos previos, consulta Configuración.
Parte 1: Actualiza el archivo de diseño (activity_main.xml) para agregar el componente Map3DView
El componente Map3DView es la vista que renderiza el mapa en 3D dentro de la app.
En los siguientes pasos, se agrega el componente y se configura el estado inicial del mapa, incluidos la posición de la cámara y los atributos relacionados:
Abre el archivo de diseño de tu actividad principal, que suele encontrarse en
app/src/main/res/layout/activity_main.xml.En el elemento raíz
ConstraintLayout(o el elemento de diseño raíz), agrega el espacio de nombres XMLmap3d:xmlns:map3d="http://schemas.android.com/apk/res-auto"Borra el
<TextView>predeterminado que muestra "Hello World!".Agrega el componente
Map3DViewa tu diseño. Puedes personalizar la posición de la cámara y otros atributos:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:map3d="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.google.android.gms.maps3d.Map3DView android:id="@+id/map3dView" android:layout_width="match_parent" android:layout_height="match_parent" map3d:mapMode="hybrid" map3d:centerLat="38.544012" map3d:centerLng="-107.670428" map3d:centerAlt="2427.6" map3d:heading="310" map3d:tilt="63" map3d:range="8266" map3d:roll="0" map3d:minAltitude="0" map3d:maxAltitude="1000000" map3d:minHeading="0" map3d:maxHeading="360" map3d:minTilt="0" map3d:maxTilt="90" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Parte 2: Actualiza MainActivity.kt
En los siguientes pasos, se inicializa el componente Map3DView que se agregó al
archivo activity_main.xml en la parte 1 y se administran los eventos del ciclo de vida del componente.
Ten en cuenta que el SDK de Maps 3D para Android solo admite una instancia de Map3DView activa a la vez. No se admite mostrar varias instancias de Map3DView de forma simultánea (p.ej., en el mismo diseño o en diferentes actividades o fragmentos visibles), ya que esto puede causar problemas de renderización, como pantallas negras en las vistas secundarias.
Además, todos los Map3DView compartirán y reflejarán el mismo estado del mapa (p.ej., la posición de la cámara, los marcadores agregados, los polígonos, etc.), que persistirá incluso si se destruye un Map3DView (con onDestroy) y se crea otro, a menos que se borre de forma manual. Por ejemplo, si agregas marcadores a Map3DView1, lo destruyes y creas Map3DView2, esos mismos marcadores seguirán presentes en Map3DView2.
Responsabilidades del desarrollador:
- Una vista a la vez: Asegúrate de que solo haya un
Map3DViewen una parte activa de tu jerarquía de vistas en cualquier momento. - Limpieza manual: Cuando cambies de un
Map3DView(p.ej.,Map3DView1) a otro (p.ej.,Map3DView2), debes llamar aonDestroy()en la instancia anterior (Map3DView1). Debido a que se comparte el estado del mapa subyacente, para garantizar queMap3DView2comience con un estado nuevo o específico, eres responsable de borrar manualmente cualquier estado establecido porMap3DView1. Esto incluye quitar marcadores, superposiciones, etcétera, y restablecer la posición de la cámara con el objetoGoogleMap3Dobtenido enOnMap3DViewReadyCallback.
Abre el archivo
MainActivity.kt, que suele encontrarse enapp/src/main/java/com/example/yourpackagename/MainActivity.kt.Agrega las importaciones necesarias para el SDK de Maps 3D para Android:
import android.util.Log import com.google.android.gms.maps3d.GoogleMap3D import com.google.android.gms.maps3d.Map3DView import com.google.android.gms.maps3d.OnMap3DViewReadyCallbackModifica la clase
MainActivitypara implementarOnMap3DViewReadyCallback:class MainActivity : AppCompatActivity(), OnMap3DViewReadyCallback {Declara variables para
Map3DViewyGoogleMap3D:private lateinit var map3DView: Map3DView private var googleMap3D: GoogleMap3D? = nullEn el método
onCreate, después desetContentView(...)y el bloqueViewCompat.setOnApplyWindowInsetsListener, inicializa elmap3DView, llama a su método de ciclo de vidaonCreatey solicita el mapa de forma asíncrona:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } map3DView = findViewById(R.id.map3dView) map3DView.onCreate(savedInstanceState) map3DView.getMap3DViewAsync(this) }Anula los métodos
onMap3DViewReadyyonError. Estas devoluciones de llamada se activan cuando el mapa está listo para usarse o cuando se produce un error durante la inicialización:override fun onMap3DViewReady(googleMap3D: GoogleMap3D) { // Interact with the googleMap3D object here this.googleMap3D = googleMap3D // You can now make calls to the googleMap3D object, e.g., // googleMap3D.flyTo(camera { ... }) } override fun onError(error: Exception) { // Handle the error gracefully here (for example, show an error dialog or log the error). Log.e("MainActivity", "Error loading 3D map", error) }Reenvía los eventos del ciclo de vida de tu actividad a
Map3DViewagregando las siguientes anulaciones aMainActivity:override fun onStart() { super.onStart() map3DView.onStart() } override fun onResume() { super.onResume() map3DView.onResume() } override fun onPause() { map3DView.onPause() super.onPause() } override fun onStop() { map3DView.onStop() super.onStop() } override fun onDestroy() { map3DView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) map3DView.onSaveInstanceState(outState) } override fun onLowMemory() { super.onLowMemory() map3DView.onLowMemory() }
Parte 3: Sincroniza Gradle y ejecuta la app
Ahora que actualizaste el diseño y la actividad de tu app, puedes compilarla y ejecutarla para ver el mapa en 3D.
Para sincronizar tu proyecto con Gradle, selecciona File > Sync Project with Gradle Files.
Para compilar y ejecutar tu app en un emulador o un dispositivo físico, selecciona Run > Run.
Si todo está configurado correctamente, deberías ver un mapa en 3D en tu app, centrado cerca de las coordenadas especificadas en tu activity_main.xml.
Estados de carga y error del mapa
El SDK de Maps 3D para Android muestra automáticamente comentarios visuales integrados mientras administra el estado del mapa:
- Superposición de carga: Se muestra un indicador de progreso centrado cuando se inicializa la vista de mapa por primera vez o cuando se carga su viewport inicial.
- Superposición de errores: Se muestra una tarjeta de error con diseño si se produce una falla crítica, como una clave de API no válida, un error de red o cuando se ejecuta en un dispositivo no compatible.
Puedes capturar estos errores de inicialización o carga de manera programática anulando onError(error:
Exception) en tu implementación de OnMap3DViewReadyCallback.
Cómo escuchar eventos de clic en el mapa
Para escuchar eventos de clic en el mapa, llama a setMap3DClickListener en GoogleMap3D.
Cuando un usuario hace clic en el mapa, la devolución de llamada onMap3DClick recibe un objeto Map3DClickEvent que proporciona la location y la placeId del punto en el que se hizo clic, y devuelve un Boolean (true para suprimir el widget de IU de Places predeterminado o false para mostrarlo). Para obtener más información, consulta
Cómo interactuar con los lugares de interés.
En el siguiente ejemplo, se muestra cómo configurar un objeto de escucha de clics en el mapa:
googleMap3D.setMap3DClickListener { event: Map3DClickEvent ->
Log.d(
"MainActivity",
"Clicked at ${event.location}, placeId: ${event.placeId}"
)
false
}
Próximos pasos
Ahora que agregaste un mapa en 3D básico a tu app, puedes explorar funciones más avanzadas del SDK de Maps en 3D para Android, como las animaciones de ruta de la cámara, los marcadores en 3D o los polígonos.