En Mundus4D las activities secundarias son utilizadas para ofrecer información adicional acerca del edificio recreado.
El apartado de información queda conformado por un Tab Host, proporcionando una interfaz de usuario distribuida en pestañas. Éste se crea extendiendo una activity específica llamada TabActivity. Google recomienda sustituir el uso de los TabHost por los llamados
“Fragments” que ofrecen una mayor libertad en la distribución del contenido en pantalla. Sin embargo, se eligió utilizar TabHost por su sencillez a la hora de programar y dado el objetivo final de la App, cumplía sobradamente con los requisitos.
En Mundus4D el TabHost queda implementado en la clase InfoActivity. Dentro se crearon una serie de pestañas dependiendo de la información obtenida de cada espacio constructivo. Dentro de cada pestaña se implementaron las clases Historia_activity, Funciones_activity y Sabias. Como resultado se obtiene que pueden aparecer 3 pestañas Historia, Funciones y Cu- riosidades.
El texto se introdujo conforme al formato Html. Esto es debido a que fue la única forma que encontré para cargar el texto desde el fichero strings.xml con la posibilidad de poder introdu- cir texto en cursiva y negrita. El comando adecuado para leer en este formato y mostrarlo en
//Objeto que hace referencia al TextView "Funciones" incluido en el layout. TextView infoFunciones = (TextView)findViewById(R.id.Funciones);
//El método Html.fromHtml se encarga de leer el texto en formato html. //El método setText carga el texto dado.
infoFunciones.setText(Html.fromHtml(getString(R.string.curia_f)));
Por último la activity Plano_Mundus_Activity consta solo de una imagen a modo de plano con los puntos adecuados donde utilizar la aplicación.
6.4.2 Activities primarias
6.4.2.1 Launcher.javaEl archivo Launcher.java es el fichero que contiene a a clase Launcher, que extiende la activi- ty inicial. En otras palabras, es la primera actividad que se desarrolla al iniciar la aplicación. Su objetivo principal es comprobar que existen todos los recursos necesarios en la aplicación e instalarlos si fuese necesario.
El funcionamiento de la activity está programado para que se ejecute de una forma secuencial y automática. El usuario no podrá realizar ninguna acción que no sea la de salir de ella dentro de ella. Se explicará más adelante en la sección donde se describe el proceso seguido para su- bir la App a Google Play y los problemas encontrados.
6.4.2.2 MenuPrincipal.java
El archivo Launcher.java es el fichero que contiene la clase MenuPrincipal, que extiende la activity encargada de gestionar el menú principal así como los menús secundarios donde se puede encontrar información acerca de la aplicación, Complutum e instrucciones de uso. La disposición en pantalla viene determinada por el “layout” o capa activity_menu_principal.- xml:
Se dispone un LinearLayout con orientación horizontal, dividido en un ScrollView y otro Li- nearLayout.
ScrollView - Permite mostrar datos que por su tamaño o longitud es necesario que el usuario
pueda desplazarse a lo largo de ellos. Como por ejemplo, un articulo de periódico de cierta longitud.
LinearLayout - Es un “layout” o capa que muestra los elementos contenidos en él, en forma
de columna o fila. En este caso el LinearLayout contenido dentro del LinearLayout principal contiene a los TextView clickables que harán la función de botones dentro del menú principal.
Cuando se crea la actividad se crean los objetos mediante programación para hacer que los TextView reaccionen ante la pulsación del usuario. Se define también el objeto ScrollView para poder variar su contenido de forma dinámica dentro del método loadContenidoScroll-
6.4.2.3 RealAumentada.java
La clase RealAumentada es la encargada de producir todo el proceso de Tracking y renderiza- do del modelo 3D. Se extiende la clase especial ARViewActivity incluida en el SDK de Metaio que simplifica enormemente la programación. Ella se encarga de inciar la actividad, activar la cámara, mantener la pantalla activa, tomar los fotogramas a analizar y administrar los surface- View necesarios para el renderizado.
También se diseña el sistema de orientación implementando SensorEventListener, explicado su funcionamiento más adelante.
Por último se gestiona el desempeño del menú desplegable, el cúal ofrece 3 opciones básicas:
Seleccionar Edificio
Se despliega un cuadro de diálogo con los diferentes espacios recreados, a su vez cada espacio puede tener diversas opciones de visualización, como es el período histórico o la posibilidad de cargar unicamente el interior o el exterior del mismo.
ID Edificio S.I S.III Exterior Interior
F. Monumental Criptopórtico Curia Decumano Basílica Pórtico Sur Termas Sur
Mercado
Ninfeo
Info
Se despliega un TabHost con información acerca del edificio activo. Se pueden desplegar has- ta tres pestañas: Historia, funciones y curiosidades.
Reposicionar
Al pulsar se realiza una llamada al método definido para cada edificio dentro de la clase Re- corrido_Tracking pasando como argumento el ID del edificio y el azimut filtrado. Su objetivo es seleccionar nuevos parámetros y cambiar el TrackingMap cuando el posicionamiento no es correcto.
6.4.3 Recorrido_Tracking.java
El archivo Recorrido_Tracking contiene la clase del mismo nombre. Se trata de una clase creada a modo de base de datos. Android utiliza SQLite como sistema de gestión de base de datos. Sin embargo, se prefirió no utilizar este sistema por cuestiones de simplicidad y la poca familiarización del autor con las bases de datos.
La clase se divide en una serie métodos básicos:
– Maps_FM(), Maps_CR(), Maps_CU(), Maps_DEC(), Maps_BAS(), Maps_PS(), Maps_TS(), Maps_MER(), Maps_NI() que funcionan a modo de bases de datos.
– Por otro lado están los métodos Seleccion_Map() y DistanciaMinima(). El primero es llamado al filtrar los datos en alguno de los métodos anteriores y el segundo es llamado por Seleccion_Map en caso de que sea necesario.
Los TrackingMaps están introducidos ordenadamente de forma que se pueda recorrer el yaci- miento en un sentido de manera continua sin que el usuario experimente un gran retardo en la búsqueda del TrackingMap válido. Por otra parte se llamaría al objeto de está clase a través del método onTrackingEvent(), empleado para realizar las acciones necesarias en función de la calidad del tracking.
Consideraciones
La clase Recorrido_Tracking está diseñada en base a la idea original de la App. Sin embargo, dado el mal desempeño mostrado en el terreno se decidió prescindir de ciertas funcionalida- des, simplificando su funcionamiento. Hecho que provocó que algunos aspectos del código cayeran en desuso. Los motivos serán explicados más adelante, sin embargo se ha querido conservarlas como plantilla, para demostrar el trabajo realizado y porque era más rápido no usarlo que reescribir el código borrando las partes no utilizadas.