lunes, 14 de noviembre de 2016

Objetos de mapas

Objetos de mapas

Los mapas se representan en la API a través de las clases GoogleMap y MapFragment.

Agregar un mapa a una aplicación de Android



Los pasos básicos para agregar un mapa son los siguientes:
  1. (Solo debes realizar este paso una vez). Sigue los pasos de la guía de configuración de proyectos para obtener la API, acceder a la clave y agregar los atributos necesarios a tu manifiesto de Android.
  2. Agrega un objeto Fragment a la Activity. Este administrará el mapa. La manera más sencilla de hacerlo es agregar un elemento <fragment> al archivo de diseño de Activity.
  3. Implementa la interfaz OnMapReadyCallback y usa el método callback onMapReady(GoogleMap) para administrar el objeto GoogleMap. El objeto GoogleMap es la representación interna del propio mapa. Para configurar las opciones de vista de un mapa, debes modificar su objeto GoogleMap.
  4. Llama a getMapAsync() en el fragmento para registrar el callback.
A continuación, se ofrece información más detallada sobre cada paso.

Agregar un fragmento

Agrega un elemento <fragment> al archivo de diseño de la actividad para definir un objeto Fragment. En este elemento, fija el atributo android:name en "com.google.android.gms.maps.MapFragment". Con esto se adjunta en forma automática un objeto MapFragment a la actividad.
El siguiente archivo de diseño contiene un elemento <fragment>:
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android"     android:name="com.google.android.gms.maps.MapFragment"     android:id="@+id/map"     android:layout_width="match_parent"     android:layout_height="match_parent"/>
También puedes agregar un objeto MapFragment a una Activity en el código. Para hacerlo, crea una nueva instancia de MapFragment y luego llama a FragmentTransaction.add() para agregar el elemento Fragmenta la Activity actual.
 mMapFragment = MapFragment.newInstance();  FragmentTransaction fragmentTransaction =          getFragmentManager().beginTransaction();  fragmentTransaction.add(R.id.my_container, mMapFragment);  fragmentTransaction.commit();

Agregar un código de mapa

Para trabajar con el mapa dentro de tu aplicación, deberás implementar la interfaz OnMapReadyCallback y configurar una instancia del callback en un objeto MapFragment o MapView. En este tutorial se usa un objeto MapFragment debido a que representa el método más común de agregar un mapa a una aplicación. El primer paso es implementar la interfaz de callback:
public class MainActivity extends FragmentActivity     implements OnMapReadyCallback { ... }
En el método onCreate() de tu Activity, configura el archivo de diseño como la vista de contenido. Por ejemplo, si el nombre del diseño es main.xml, usa este código:
@Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     ... }
Para administrar el fragmento, llama a FragmentManager.findFragmentById() y pásale el id. de recursos de tu elemento <fragment>. Ten en cuenta que el id. de recursos R.id.map se agrega automáticamente al proyecto de Android cuando creas el archivo de diseño.
Luego usa getMapAsync() para configurar el callback del fragmento.
MapFragment mapFragment = (MapFragment) getFragmentManager()     .findFragmentById(R.id.map); mapFragment.getMapAsync(this);
Nota: Google Maps Android API necesita una API de nivel 12 o superior para admitir objetos MapFragment. Si apuntas a una aplicación anterior a la API nivel 12, puedes acceder a la misma funcionalidad a través de la claseSupportMapFragment. También debes incluir la biblioteca de compatibilidad de Android.
Nota: se debe llamar a getMapAsync() desde el subproceso principal. El callback se ejecutará en este. Si los Google Play Services no están instalados en el dispositivo del usuario, el callback no se activará hasta que el usuario los instale.
Usa el método callback onMapReady(GoogleMap) para administrar el objeto GoogleMap. El callback se activa cuando el está listo para usarse. Proporciona una instancia no nula de GoogleMap. Por ejemplo, puedes usar el objeto GoogleMap para configurar las opciones de vista del mapa o agregar un marcador .
@Override public void onMapReady(GoogleMap map) {     map.addMarker(new MarkerOptions()         .position(new LatLng(0, 0))         .title("Marker")); }

El objeto “Map”

La Google Maps Android API te permite mostrar un mapa de Google en tu aplicación de Android. El aspecto de estos mapas es idéntico al de los mapas que se ven en la aplicación Google Maps for Mobile (GMM) app, y la API exhibe muchas funciones idénticas. Las siguientes son dos diferencias distinguidas entre la aplicación GMM y los mapas que muestra la Google Maps Android API:
  • Los mosaicos que muestra la API no tienen contenido personalizado, como los iconos inteligentes personalizados.
  • No todos los iconos del mapa son seleccionables. No es posible, por ejemplo, hacer clic en los iconos de estaciones de transporte. Sin embargo, es posible seleccionar los marcadores que se agregan al mapa, y la API cuenta con una interfaz de callback de receptores para varias interacciones con marcadores.
Además de la funcionalidad de asignación, la API admite una variedad completa de interacciones coherentes con el modelo de IU de Android. Por ejemplo, puedes configurar interacciones con un mapa definiendo receptores que respondan a gestos del usuario.
Al trabajar con un objeto de mapa, la clase fundamental es GoogleMapGoogleMap modela el objeto de mapa dentro de tu aplicación. Dentro de tu IU, un mapa se representará a través de un objeto MapFragment o MapView.
GoogleMap administra las siguientes operaciones de manera automática:
  • conexión al servicio de Google Maps;
  • descarga de mosaicos de mapas;
  • visualización de mosaicos en la pantalla del dispositivo;
  • visualización de varios controles, como el desplazamiento y el zoom.
  • respuesta a gestos de desplazamiento y zoom a través del movimiento del mapa y su acercamiento o alejamiento.
Además de estas operaciones automáticas, puedes controlar el comportamiento de los mapas con objetos y métodos de la API. Por ejemplo, GoogleMap tiene métodos callback que responden a la pulsación de teclas y a gestos táctiles en el mapa. También puedes configurar iconos de marcadores en tu mapa y agregarle diseños a través de objetos que proporciones a GoogleMap.

MapFragment

MapFragment, una subclase de la clase Fragment de Android, te permite disponer un mapa en un fragmento de Android. Los objetos MapFragment actúan como contenedores del mapa y brindan acceso al objeto GoogleMap.
A diferencia de un objeto View, un objeto Fragment representa un comportamiento o una parte de la interfaz de usuario en una actividad. Puedes combinar varios fragmentos en una sola actividad para crear una IU multipanel y volver a usar un fragmento en diferentes actividades. Para obtener más información, consulta la documentación de Android relacionada con los fragmentos.

MapView

MapView, una subclase de la clase View de Android, te permite disponer un mapa en un objeto View de Android. Un objeto View representa una sección rectangular de la pantalla y es un bloque de creación fundamental para aplicaciones y widgets de Android. Al igual que MapFragment, en muchos aspectos, MapViewactúa como un contenedor del mapa y exhibe la funcionalidad principal de este a través del objeto GoogleMap.
Al usar la API en el modo totalmente interactivo, los usuarios de esta clase deben enviar todos los métodos de ciclo de vida de actividad a los métodos correspondientes de la clase MapView. Entre los ejemplos de los métodos de ciclo de vida se incluyen onCreate()onDestroy()onResume() y onPause(). Cuando se usa la API en el modo básico, el envío de eventos de ciclo de vida es opcional. Para obtener información detallada, consulta la documentación sobre el modo básico.

Tipos de mapas

Existen muchos tipos de mapas disponibles en la Google Maps Android API. El tipo de un mapa determina la representación general de este. Por ejemplo, un atlas generalmente contiene mapas políticos que se centran en la visualización de fronteras. En los mapas de carreteras se muestran todas las carreteras de una ciudad o región.
La Google Maps Android API ofrece cuatro clases de mapas y una opción para que no se muestre ninguno:
Normal
Mapa de carreteras típico. En él se muestran carreteras, elementos naturales importantes y elementos artificiales, como los ríos. También se ven etiquetas de carreteras y elementos.
Híbrido
Datos de fotos satelitales con mapas de carreteras agregados. También se ven etiquetas de carreteras y elementos.
Satélite
Datos de fotos satelitales. No se ven etiquetas de carreteras y elementos.
Tierra
Datos topográficos. En el mapa se incluyen colores, líneas de contornos y etiquetas, y sombreados de perspectiva. También se pueden ver carreteras y etiquetas.
Ninguno
Ausencia de mosaicos. El mapa se representa como una cuadrícula vacía sin mosaicos cargados.

Cambiar el tipo de mapa

Para configurar el tipo de un mapa, llama al método setMapType() del objeto GoogleMap y pásale una de las constantes de tipo definidas en GoogleMap. Por ejemplo, para que se muestre un mapa satelital:
GoogleMap map; ... // Sets the map type to be "hybrid" map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
En la imagen siguiente se muestra una comparación de mapas normales, híbridos y de tierra para la misma ubicación:
Comparación de MapType.

Mapas de interiores

Con altos niveles de zoom, en el mapa se mostrarán planos de pisos para espacios interiores, como en aeropuertos, centros comerciales, grandes tiendas minoristas y estaciones de transporte. Estos planos de pisos, denominados “mapas de interiores”, se muestran para los tipos de mapas “Normal” y “Satélite” (GoogleMap.MAP_TYPE_NORMAL y GoogleMap.MAP_TYPE_SATELLITE). Se habilitan en forma automática cuando el usuario aplica zoom de acercamiento y desaparecen cuando aplica zoom de alejamiento.

Trabajar con mapas de interiores en la API

A continuación, se muestra un resumen de la funcionalidad de mapas de interiores de la API:
  • Puedes deshabilitar los mapas llamando a GoogleMap.setIndoorEnabled(false). De manera predeterminada, los mapas de interiores vienen habilitados. Los mapas de interiores se muestran en un mapa a la vez. De manera predeterminada, este es el primer mapa que se agrega a tu aplicación. Si deseas que se muestren mapas de interiores en un mapa diferente, deshabilítalos en el primer mapa y luego llama a setIndoorEnabled(true) en el segundo mapa.
  • Para deshabilitar el seleccionador de niveles predeterminado (seleccionadorector de pisos), llama aGoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false). Para obtener información detallada, consulta Cómo interactuar con el mapa.
  • OnIndoorStateChangeListener, una interfaz de GoogleMap, te permite configurar un receptor que se llamará cuando se enfoque un nuevo edificio o se active un nuevo piso de un edificio. Para obtener información detallada, consulta Cómo interactuar con el mapa.
  • GoogleMap.getFocusedBuilding() te proporciona el edificio que está en foco en el momento. De esta manera, puedes hallar el piso actualmente activo llamando a IndoorBuilding.getActiveLevelIndex(). Consulta la documentación de referencia para ver toda la información disponible en los objetosIndoorBuilding y IndoorLevel.

Agregar planos de pisos

Hay disponibles mapas de interiores (planos de pisos) en ubicaciones seleccionadas. Si no hay disponibles datos de planos de pisos para un edificio que desees resaltar en tu aplicación, puedes:

Configurar un estado inicial

La Google Maps API te permite configurar el estado inicial del mapa según las necesidades de tu aplicación. Puedes especificar lo siguiente:
  • la posición de la cámara. Se incluyen la ubicación, el zoom, el rumbo y la inclinación. Para obtener información detallada sobre el posicionamiento de la cámara, consulta Cómo cambiar la vista de mapas.
  • El tipo de mapa.
  • La posibilidad de que los botones de zoom y la brújula aparezcan en pantalla.
  • Los gestos que puede emplear un usuario para manipular la cámara.
  • La posibilidad de que se habilite o no el modo básico. Un mapa en el modo básico es una imagen de mapa de bits que admite un subconjunto de la funcionalidad proporcionado por la API completa.
Puedes configurar el estado inicial del mapa a través de XML, si agregaste el mapa al archivo de diseño de tu actividad, o de manera programática, si agregaste el mapa de esa manera.

Cómo usar atributos de XML

En esta sección se describe la manera de configurar el estado inicial del mapa en caso de que hayas agregado un mapa a tu aplicación usando un archivo de diseño XML.
La Google Maps API define un conjunto de atributos XML personalizados para un objeto MapFragment o MapView que puedes usar para configurar el estado inicial del mapa directamente desde el archivo de diseño. Actualmente, se encuentran definidos los siguientes atributos:
  • mapType. Permite especificar el tipo de mapa que se mostrará. Entre los valores válidos, se incluyen nonenormalhybridsatellite y terrain.
  • cameraTargetLatcameraTargetLngcameraZoomcameraBearing, y cameraTilt. Te permiten especificar la posición inicial de la cámara. Para obtener información detallada sobre la posición de la cámara, consulta esta sección.
  • uiZoomControls y uiCompass. Te permiten especificar si deseas que los controles de zoom y la brújula aparezcan en el mapa. Consulta UiSettings para obtener información detallada.
  • uiZoomGesturesuiScrollGesturesuiRotateGestures y uiTiltGestures. Te permiten especificar los gestos que se habilitan o deshabilitan para la interacción con el mapa. Consulta UiSettings para obtener más información.
  • zOrderOnTop. Te permite controlar la posibilidad de que la superficie de la vista del mapa se disponga sobre su ventana. Consulta SurfaceView.setZOrderOnTop(boolean) para obtener información detallada. Ten en cuenta que esto abarcará todas las vistas que podrían aparecer en el mapa (p. ej., los controles de zoom y el botón “My location”).
  • useViewLifecycle. Solo es válido con un objeto MapFragment. Este atributo especifica si el ciclo de vida del mapa debe vincularse a la vista del fragmento o al propio fragmento. Consulta esta sección para obtener información detallada.
  • liteMode. Un valor true fija el modo básico de un mapa. Un mapa en el modo básico es una imagen de mapa de bits que admite un subconjunto de la funcionalidad proporcionado por la API completa. El valor predeterminado de este atributo es false.
Para usar estos atributos personalizados dentro de tu archivo de diseño XML, primero debes agregar la declaración de espacio de nombres siguiente. Puedes seleccionar cualquier espacio de nombres, no es necesario que sea map:
xmlns:map="http://schemas.android.com/apk/res-auto"
Luego, puedes agregar los atributos con un prefijo map: a tus componentes de diseño, tal como lo harías con atributos estándares de Android.
En el siguiente fragmento de código, se muestra la manera de configurar un objeto MapFragment con algunas opciones personalizadas. Pueden aplicarse los mismos atributos a un objeto MapView.
<fragment xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:map="http://schemas.android.com/apk/res-auto"   android:name="com.google.android.gms.maps.SupportMapFragment"   android:id="@+id/map"   android:layout_width="match_parent"   android:layout_height="match_parent"   map:cameraBearing="112.5"   map:cameraTargetLat="-33.796923"   map:cameraTargetLng="150.922433"   map:cameraTilt="30"   map:cameraZoom="13"   map:mapType="normal"   map:uiCompass="false"   map:uiRotateGestures="true"   map:uiScrollGestures="false"   map:uiTiltGestures="true"   map:uiZoomControls="false"   map:uiZoomGestures="true"/>
Nota: Si usas Google Maps Mobile SDK for Work, debes agregar a cada atributo el prefijo m4b_. Al especificar el atributo de tipo de mapa, por ejemplo, usa m4b_mapType en lugar de mapType. También, al especificar controles de zoom, debes usar m4b_uiZoomControls en lugar de uiZoomControls y así sucesivamente.

Programáticamente

En esta sección se describe la manera de configurar el estado inicial del mapa en caso de que hayas agregado un mapa a tu aplicación de manera programática.
Si agregaste un objeto MapFragment (o MapView) de manera programática, puedes configurar su estado inicial pasando un objeto GoogleMapOptions con las opciones que especifiques. Las opciones disponibles son exactamente las mismas que ofrece XML. Puedes crear un objeto GoogleMapOptions como el siguiente:
GoogleMapOptions options = new GoogleMapOptions();
Luego puedes configurarla de la siguiente manera:
options.mapType(GoogleMap.MAP_TYPE_SATELLITE)     .compassEnabled(false)     .rotateGesturesEnabled(false)     .tiltGesturesEnabled(false);
Para aplicar estas opciones cuando crees un mapa, realiza uno de los siguientes pasos:

Relleno de mapas

En este video se muestra un ejemplo de rellenos de mapas.
Los mapas de Google están diseñados para abarcar toda la región definida por su elemento contenedor, normalmente un objeto MapView o MapFragment. Varios aspectos relacionados con la presentación y el comportamiento del mapa se definen por las dimensiones de su contenedor:
  • El objetivo de la cámara refleja el centro de la región con relleno.
  • Los controles del mapa tienen una posición relativa al límite del mapa.
  • La información legal, como las declaraciones de derechos de autor o el logotipo de Google, aparece en el límite inferior del mapa.
Puedes agregar relleno alrededor de los límites del mapa usando el método GoogleMapsetPadding(). El mapa continuará rellenando todo el contenedor, pero el posicionamiento del texto y de los controles, los gestos de mapa y los movimientos de la cámara se comportarán como si este se posicionara en un espacio más pequeño. Esto genera los siguientes cambios:
  • Los movimientos de la cámara a través de llamadas de API o activaciones de botones (p. ej., brújula, “My Location” y zoom) guardarán relación con la región con relleno.
  • getCameraPosition() devuelve el centro de la región con relleno.
  • Projection.getVisibleRegion() devuelve la región con relleno.
  • Los controles de IU se desviarán del límite del contenedor a través del número de píxeles especificado.
El relleno puede resultar útil al diseñar IU que se superpongan con una parte determinada del mapa. En la imagen siguiente, por ejemplo, el mapa se agrega en los límites superior y derecho. Los controles del mapa y el texto legal visibles aparecerán en los límites de la región con relleno, en color verde, mientras que el mapa continuará rellenando todo el contenedor, que se muestra en azul. En este ejemplo, se puede hacer flotante un menú del lado derecho del mapa sin oscurecer los controles de este.
Relleno de mapas.
Nota: Conforme a las condiciones de servicio de la Google Maps API, el logotipo de Google y los avisos de derechos de autor no deben eliminarse de tu aplicación ni ocultarse en ella. El relleno de mapas te permite cambiar la posición de estos elementos si es necesario. Si haces que aparezca una IU en la parte inferior del mapa, agrega relleno a esta parte para que el logotipo y los avisos legales siempre sean visibles.

No hay comentarios:

Publicar un comentario

Blogger Widgets