App Inventor Tutor
App Inventor Tutor
Objetivo
Que el alumno se interiorice con las características generales de App Inventor, tanto
en lo referente al entorno de diseño y al entorno de programación por bloques, como a
los softwares necesarios para su uso.
Consideraciones Previas
Que el alumno sea capaz de comenzar nuevos proyectos para la construcción de Apps,
se interiorice en el uso y configuración de los componentes, aprenda a utilizar y com-
binar distintos bloques de programación, así como también conceptos de programación
básicos propios de App Inventor.
1
UTN – PROGRAMA DIGITAL JUNIOR
En este módulo estudiaremos las distintas posibilidades con las que contamos dentro
de App Inventor para probar el funcionamiento de nuestras Apps, a fin de realizar lo
que en programación se conoce como depuración. Aprenderemos también sobre el uso
de múltiples pantallas dentro de una misma App, así como también conceptos de pro-
gramación referente a bloques de texto y matemáticos.
Concepto de Depuración
Modos de Prueba o Depuración
Software Necesario
Uso del programa aiStarter
Uso del Emulador
Conexión a través de USB
Modo de Depuración USB
Problemas Comunes
2
UTN – PROGRAMA DIGITAL JUNIOR
Proyecto 02
3
UTN – PROGRAMA DIGITAL JUNIOR
Diseño y Configuración
4
UTN – PROGRAMA DIGITAL JUNIOR
Programación de la App
En este módulo vamos a aprender sobre el uso de los compontes del tipo media (multi-
media) y del tipo storage (almacenamiento), así como también algunos del tipo User
Interface que nos serán de particular utilidad para con los dos primeros tipos.
Grabadora de Voz
En este módulo vamos a aprender sobre el uso de los componentes del tipo “Sensor”.
Aprenderemos también sobre uso del componente Notifier, uso de ImageSprites para
5
UTN – PROGRAMA DIGITAL JUNIOR
desplazar imágenes dentro de un Canvas, así como otros conceptos propios del editor
de bloques.
Diseño y Configuración
Programación de la App
6
UTN – PROGRAMA DIGITAL JUNIOR
Diseño y Configuración
Uso de TableArrangements
Determinando el Tamaño de los Componentes
Programación de la App
Casos particulares
7
UTN – PROGRAMA DIGITAL JUNIOR
Objetivo
El objetivo del presente módulo es que el alumno se interiorice con las características
generales de App Inventor, tanto en lo referente al entorno de diseño y al entorno de
programación por bloques, como a los softwares necesarios para su uso.
Consideraciones Previas
Una computadora con conexión a internet y puerto USB. Se puede optar por
alguna de las siguientes 3 posibilidades:
2) Navegador
8
UTN – PROGRAMA DIGITAL JUNIOR
Para los dos últimos casos, el teléfono o tablet debe contar con sistema operativo
Android 2.3 (Gingerbread) o superior y tener instalada la aplicación MIT AI2 Com-
panion App que se puede descargar desde el siguiente link:
[Link]
[Link]
Este programa requiere del uso de Java, que es provisto por Oracle gratuitamente en
esta dirección:
[Link]
Para poder comenzar a trabajar con App Inventor, necesitaremos disponer de una
cuenta de Google, la cual utilizaremos para “loggearnos” en dicho sitio web. La misma
la podremos crear a través de la página de Gmail:
[Link]
En la esquina superior derecha, encontraremos el botón Crear una cuenta:
9
UTN – PROGRAMA DIGITAL JUNIOR
10
UTN – PROGRAMA DIGITAL JUNIOR
Listo, ya tenemos nuestra cuenta de Google. Se nos propondrá agregar más informa-
ción a nuestro perfil de usuario para usarlo en Google+ (la red social de Google), pero
esto no será necesario para utilizar el servicio de App Inventor.
Ya estamos listos para dirigirnos a la página de App Inventor, cuya dirección es:
[Link]
11
UTN – PROGRAMA DIGITAL JUNIOR
En la misma verificamos que la cuenta que usaremos para “loggearnos” es la misma que
ingresamos en el paso anterior, damos clic en Permitir y ya estaremos listos para em-
pezar a utilizar los servicios de App Inventor 2. Al hacer esto se nos presenta la si-
guiente página:
12
UTN – PROGRAMA DIGITAL JUNIOR
En ella se nos presenta un cuadro de bienvenida, el cual nos informa las últimas nove-
dades de App Inventor. Hacemos clic en Continue y listo, ya habremos ingresado den-
tro del entorno de desarrollo.
Es posible que antes de esto nos aparezca un recuadro proponiéndonos contestar una
encuesta para mejorar el servicio. De estar interesados en completar la misma mas
tarde cliqueamos en Take Survey Later, de otro modo daremos clic en Never Take
Survey y ya no nos aparecerá más este cartel.
Nota: Esta encuesta se debe a que el sitio de App Inventor 2 está siendo constante-
mente modificado y mejorado, por lo que algunos contenidos del presente curso pue-
den diferir de lo que se puede encontrar en la página al momento de su estudio.
Una vez hecho esto, nos aparecerá otro cartel indicándonos que no disponemos de nin-
gún proyecto dentro de App Inventor 2, y que de haber trabajado en el App Inven-
tor anterior (App Inventor 1, por así decir), nuestros proyectos se encuentran a salvo
todavía en esa otra versión.
13
UTN – PROGRAMA DIGITAL JUNIOR
Simplemente ignoramos este cartel y nos disponemos a comenzar. Para esto, bastará
cliquear en cualquier parte de la página, por lo que vamos a cliquear directamente en el
botón New Project, que se encuentra en la esquina superior derecha, debajo del logo
del MIT App Inventor 2.
Una vez que cliqueamos en New Project, nos parecerá automáticamente un cuadro de
diálogo en el cual vamos a indicar el nombre que llevará nuestro proyecto, supongamos
por caso Proyecto01:
Al presionar la tecla enter, veremos por unos segundos el nombre de proyecto recién
creado, dentro del espacio en cual nos van a aparecer todos los proyectos que vayamos
creando, en la forma de un listado:
14
UTN – PROGRAMA DIGITAL JUNIOR
Debido a que, sólo contamos con este proyecto (por ser el primero), este se abrirá
automáticamente, con lo cual estaremos frente a una pantalla como la que sigue a con-
tinuación, a la cual hemos agregado algunas descripciones generales:
En dicha barra también aparecen algunos links a las funciones más usadas. Estos son:
15
UTN – PROGRAMA DIGITAL JUNIOR
Por último, nuestro nombre de usuario, donde al cliquear podremos cerrar la sesión
(Sing out).
Todo esto lo veremos con más detalle a medida que lo vayamos usemos en módulos
posteriores.
Seguido a esto, encontramos una barra de menús color verde con el nombre del pro-
yecto y algunos botones:
Con el primer botón (Screen1) podremos seleccionar en cuál de las pantallas de la App
queremos trabajar en ese momento, para los casos en los que contemos con más de una
pantalla o Screen.
El siguiente botón (Add Screen), sirve para agregar una nueva pantalla al proyecto.
16
UTN – PROGRAMA DIGITAL JUNIOR
Entre los submenús de los cuales disponemos, haremos uso de los siguientes:
Los componentes LEGO MINDSTORMS son sólo útiles en el caso de contar con el
juego de robótica para niños del mismo nombre, por lo que no los vamos a utilizar.
Aquí es donde vamos a colocar los distintos componentes antes mencionados, de modo
que nuestra aplicación vaya adquiriendo el aspecto y la forma deseados. De este modo,
tendremos una vista preliminar de cómo se verán las distintas pantallas de dicha App
una vez terminada.
17
UTN – PROGRAMA DIGITAL JUNIOR
Al cliquear en dicho botón se nos abrirá una ventana de exploración de archivos, donde
podremos seleccionar el archivo de deseado. Una vez seleccionado, daremos clic en
aceptar, para retornar al cuadro de diálogo, donde nos aparecerá el nombre del archi-
vo que vamos a subir:
18
UTN – PROGRAMA DIGITAL JUNIOR
En este caso podemos apreciar las propiedades del componente Screen1. Entre las
más importantes podemos mencionar:
19
UTN – PROGRAMA DIGITAL JUNIOR
Como se puede apreciar aquí, seguimos disponiendo tanto de la barra de menú gris,
como de la barra verde antes mencionadas, pero en este caso vamos a contar con co-
lumnas y ventanas diferentes.
20
UTN – PROGRAMA DIGITAL JUNIOR
Conviene recalcar aquí, que la programación que llevemos a cabo dentro de la ventana
Viewer, lo será para una pantalla o Screen determinada. Esto quiere decir que ten-
dremos que seleccionar a cuál de las pantallas corresponderán los bloques que iremos
agregando en dicha ventana.
Para cambiar de pantalla, cliqueamos sobre del botón Screen‘N’ (donde ‘N’ es el núme-
ro de la pantalla actualmente seleccionada), que encontraremos en la barra de menús
verde. Se nos desplegará un menú donde podremos llevar a cabo dicha selección.
Veremos que dentro de la columna Blocks hay una serie de menús, conocidos como
drawers (cajones). En primer lugar encontraremos el menú Built-in (o de bloques inte-
grados).
Los bloques de control son aquellos que nos permitirán determinar el comportamiento
de la App a partir del cambio de ciertos estados o condiciones.
La App “percibirá” dichos cambios a través distintos elementos, como puede ser el
cambio del valor de una variable, el cambio de estado de un sensor (Accelerometer-
Sensor, LocationSensor), una acción del usuario (un toque en la pantalla), sucesos de
tiempo (componente Clock), etc.
21
UTN – PROGRAMA DIGITAL JUNIOR
Con este tipo de bloques podremos realizar lo que se conocen como operaciones lógi-
cas, o sea, operaciones entre distintos valores de verdad (verdadero o falso).
Con ellos podremos crear relaciones entre distintos elementos con el fin de detectar
las condiciones deseadas para llevar a cabo una determinada acción. Usaremos dichas
relaciones dentro de los bloques de control, de manera que el comportamiento del
programa sea más complejo y acertado a nuestras expectativas.
También tenemos bloques que nos permiten asignar valores lógicos verdaderos (true),
valores lógicos falsos (false), o invertir el valor de verdad encontrado (not), o sea,
que se convierta en falso un valor verdadero y viceversa (que se convierta en verda-
dero un valor falso).
Entre estos bloques encontraremos los necesarios para realizar todo tipo de opera-
ciones aritméticas, como ser suma y resta, multiplicación y división, raíz cuadrada y
potenciación, etc.
22
UTN – PROGRAMA DIGITAL JUNIOR
Vamos a encontrar también bloques con funciones especiales, como aquellos del tipo
random, que nos van a permitir generar números aleatorios, o los bloques sin, cos y tan
para resolver funciones trigonométricas.
Los bloques de texto nos resultaran muy útiles para realizar operaciones sobre lo que
se conoce como cadenas de caracteres (o strings).
Podemos pensar en una cadena de caracteres como en una oración, la cual está forma-
da por cualquier tipo de carácter (letras, espacios, números, comas, puntos, etc.) en
cualquier orden, y cuyo largo puede ser tanto de uno como de muchos de los mismos.
23
UTN – PROGRAMA DIGITAL JUNIOR
En la lista de la imagen podemos ver que el primero de ellos tiene la forma “_”. Dicho
bloque nos permite ingresar cualquier palabra o conjunto de caracteres que queramos
utilizar dentro de la App cuando esta se encuentre corriendo dentro de un dispositivo.
Estos bloques nos van a permitir crear y manipular diferentes conjuntos de datos,
valores o elementos, agrupándolos dentro de los que conoceremos como listas (lists).
Las listas son un tipo de estructura de datos muy utilizada en todo tipo de lenguajes
de programación, no sólo App Inventor.
Como ejemplo, podemos pensar en un juego que puede contener una lista de los punta-
jes más altos o en la web de Facebook que mantiene una lista de sus amigos.
Esto quiere decir, que podremos hacer referencia a un elemento determinado dentro
de una determinada lista, sabiendo el nombre de la misma y el número de índice del
elemento buscado. Profundizaremos al respecto más adelante.
24
UTN – PROGRAMA DIGITAL JUNIOR
Estos bloques nos permitirán hacer cambios en la selección del color de determinados
elementos dentro de nuestra aplicación.
Veremos más adelante que muchas de las propiedades (las que aparecen en la columna
Properties), pueden modificarse directamente dentro del editor de bloques. Un ejem-
plo de esto sería el color de fondo de la pantalla actual, el cual podremos cambiar uti-
lizando los bloques a continuación mostrados:
Podremos crear también colores personalizados, por medio del bloque make_color, al
cual le “pasaremos” tres valores numéricos de entre 0 y 255, indicando la cantidad de
color rojo, verde y azul que deseamos mezclar.
25
UTN – PROGRAMA DIGITAL JUNIOR
Encontraremos aquí los bloques que nos permitirán crear (initialize), llamar (get) y
modificar (set) lo que en programación se conocen como variables. Como dijimos ante-
riormente, podemos pensar en las variables como “cajitas” en las cuales vamos a guar-
dar la información que vamos a necesitar posteriormente para realizar una determi-
nada acción dentro de un bloque o secuencia de bloques.
Crearemos nuestras variables con el uso de los bloques del tipo initialize, que quiere
decir inicializar. En programación se dice que se inicializa una variable, cuando se la
crea, se define su tipo y se le asigna un valor.
Podemos dividir a las variables en dos grandes grupos; variables globales (global) y
variables locales (local).
Las variables globales son “visibles” dentro de todo el programa; esto quiere decir
que las podemos leer o modificar dentro de cualquier bloque y en cualquier momento,
y conservan su valor hasta la próxima modificación.
Las variable locales, por el contrario, serán sólo visibles para leerlas o modificarlas
dentro del bloque en el que se las creo, y conservan su valor mientras el programa no
salga de dicho bloque. Una vez fuera de este, la variable desaparece junto con su va-
lor.
Si el bloque mencionado vuelve a ser ejecutado, la variable local vuelve a ser iniciali-
zada, para ser utilizada dentro de este hasta el momento en que su ejecución termine.
26
UTN – PROGRAMA DIGITAL JUNIOR
Esto permite que en lugar de tener que colocar la misma secuencia de bloques una y
otra vez, podamos crear un procedimiento, el cual contenga todos los bloques tan sólo
una vez, para luego llamar a dicha secuencia por medio de su nombre, todas y cada una
de las veces que necesitemos que la misma sea ejecutada.
27
UTN – PROGRAMA DIGITAL JUNIOR
Bloques Especiales
Cómo podremos apreciar en la siguiente imagen, existen bloques especiales para de-
terminados componentes, en este caso, la pantalla en la que estamos trabajando.
Estos bloques nos dan acceso a funciones que de otro no podríamos utilizar, como por
ejemplo, el ejecutar una secuencia de bloques especifica al momento del inicio de la
pantalla (when_Screen1_initialize_do), o qué sucederá cuando el usuario presione la
tecla volver (when_Screen1_BackPressed_do).
Por otro lado, también contaremos con bloques de programación específicos para los
componentes que hayamos agregado dentro del entorno de diseño (designer).
28
UTN – PROGRAMA DIGITAL JUNIOR
Por último, encontraremos el grupo Any component (Cualquier componente), que con-
tiene bloques que nos permitirán trabajar con varios componentes del mismo tipo a la
vez, y los iremos mencionando a medida que los vayamos usando.
Una vez que hayamos configurado la PC, y que estemos familiarizados con las funciona-
lidades generales del entorno de diseño y del editor de programación por bloques,
estaremos listos para dar los primeros pasos en la construcción de nuestras Apps.
El objetivo del presente módulo es que el alumno sea capaz de comenzar nuevos pro-
yectos para la construcción de Apps, se interiorice en el uso y configuración de los
componentes, aprenda a utilizar y combinar distintos bloques de programación, así
como también conceptos básicos de programación propios de App Inventor.
Comencemos por crear un nuevo proyecto. Cliqueando sobre la barra gris en Project ->
Start new project, e ingresando el nombre del proyecto, por caso “Proyecto01” (no se
admiten espacios como parte del nombre).
Concepto de componentes
Como comentamos anteriormente, los componentes que vamos agregar a nuestra App
se encuentran en el lado izquierdo del entorno de diseño, dentro de la columna Palet-
te. Dichos componentes son los elementos básicos que necesitamos para construir
nuestras Apps.
29
UTN – PROGRAMA DIGITAL JUNIOR
Estos son como los ingredientes de una receta. Algunos componentes son muy simples,
como el componente Label (etiqueta o leyenda), el cual sólo muestra un texto en pan-
talla, o el componente Button, que al tocarlo ejecuta una serie de acciones.
Comencemos colocando uno de estos dentro de nuestra App. Para esto, cliquearemos
sobre la opción Button, y mientras mantenemos cliqueado, desplazaremos el cursor
sobre la pantalla Screen1, que está dentro de la ventana Viewer:
30
UTN – PROGRAMA DIGITAL JUNIOR
Existe otra forma de cambiar esta propiedad (la propiedad color), así como también
las otras propiedades que presenta el botón Button1.
Esto nos va a resultar bastante útil para dar “vida” a nuestras aplicaciones, y es posi-
ble gracias al Editor de Bloques (Blocks Editor). A este accederemos, como ya lo he-
mos mencionado, cliqueando en el botón Blocks que se encuentra en la barra verde, a la
derecha del botón Designer.
Una vez dentro del editor, veremos que en la columna Blocks aparecen nuevos elemen-
tos, tanto debajo de Screen1 como de Any component.
Dichos elementos están relacionados (en este caso) con el botón Button1, el cual
agregáramos en el entorno de diseño.
De este modo, cualquier otro componente que agreguemos a la pantalla Screen1 apa-
recerá aquí, de manera que tengamos disponibles los bloques de programación y las
funcionalidades que nos permitirán operar con ellos.
Cómo ejemplo, podemos ver que al cliquear en Buttón1, nos aparecerá lo siguiente:
31
UTN – PROGRAMA DIGITAL JUNIOR
Como podemos apreciar, el color de los bloques varía según la función. Los bloques de
color mostaza son lo que llamaremos bloques de control de eventos, controladores de
eventos, o simplemente “eventos”, y su color se corresponde con el de los bloques de
control de uso general. Podremos distinguirlos además, porque este tipo de bloques
comienzan con la palabra when… (cuando…).
Debido a esta característica particular, donde para realizar una acción primero tiene
que suceder algo, decimos que en App Inventor el lenguaje de programación está
orientado a eventos.
32
UTN – PROGRAMA DIGITAL JUNIOR
Al primero de estos se lo conoce como getter (de obtener), y de volverá el valor actual
de la propiedad BackgroundColor (que en un primer momento será igual a default),
mientras que al segundo se lo conoce como setter (de establecer), y nos permitirá
definir (“setear”) un nuevo valor de color para dicha propiedad.
Unión de Bloques
33
UTN – PROGRAMA DIGITAL JUNIOR
Una vez colocado, puede suceder que en dicho bloque aparezca un signo de adverten-
cia ( ). Al cliquear sobre este, veremos un mensaje que nos informa que debemos
completar todas las entradas o encastres (sockets) vacíos de dicho bloque:
El mismo desaparecerá una vez que completemos el bloque, pero también es posible
“esconderlo” cliqueando sobre la leyenda “hide warnings”, que se encuentra en la parte
inferior izquierda de la ventana Viewer.
34
UTN – PROGRAMA DIGITAL JUNIOR
Ahora vamos a modificar un poco la aplicación para hacer que su comportamiento sea
algo más complejo. Para esto, vamos a utilizar un tipo de bloques de control conocidos
como if_then (si…entonces…) e if_then_else (si…entonces…sino…).
A continuación podemos ver un bloque if_then. Lo que hace este bloque es comprobar
la condición colocada en el encastre if; si la condición es verdadera, realiza las accio-
nes que se encuentran dentro del espacio titulado como then; de lo contrario, dichas
acciones son ignoradas.
35
UTN – PROGRAMA DIGITAL JUNIOR
Como se puede ver en la figura, este bloque tiene un cuadrito azul en su esquina supe-
rior izquierda con un simbolito adentro ( ). Esto es debido a que el mismo pertenece
a un tipo particular de bloques dentro de App Inventor conocidos como Mutators o
Mutadores.
Si hacemos clic en dicho cuadro, podremos ver que nos aparecerá una burbuja dividida
en dos. Dentro de esta burbuja podremos ver una serie de “pseudo-bloques” que re-
presentan ciertas características del bloque mutador.
Hemos dado en llamar aquí a estos bloques como pseudo-bloques, para diferenciarlos
de los bloques de programación propiamente dichos, ya que cumplen una función dife-
rente.
De este modo, si por ejemplo agregáramos el pseudo-bloque else, nos quedaría un blo-
que del tipo if_then_else:
36
UTN – PROGRAMA DIGITAL JUNIOR
Duplicación de Bloques
También podemos hacer clic derecho sobre el conjunto de bloques que se desea dupli-
car y seleccionar la opción Duplicate en el menú desplegable que nos aparece.
Una vez duplicado, bastará con que reacomodemos este nuevo conjunto de bloques
set_Button1.BackgroundColor y que seleccionemos un nuevo color, cliqueando sobre el
bloque de color que queremos cambiar:
37
UTN – PROGRAMA DIGITAL JUNIOR
Elegimos por caso el color verde y listo; Ya tendremos nuestro nuevo bloque
set_Button1.BackgroundColor con su color correspondiente.
Ahora vamos a inicializar una variable de nombre ‘i’, la cual vamos a utilizar para “se-
guir” los cambios en el color de fondo de nuestro botón. Tomaremos para esto un blo-
que initialize_global_name_to que está dentro de Blocks, en el submenú variables.
La expresión “global” nos indica que está será una variable del tipo global, lo que signi-
fica que dicha variable podrá usarse, leerse o modificarse dentro de cualquier se-
cuencia de bloques que pertenezca a esa pantalla (o Screen), no así a las pantallas
restantes.
El hacer esto (el darle un nombre, un tipo y un valor a una variable), es lo que en pro-
gramación se conoce como inicialización de una variable.
Typeblocking
38
UTN – PROGRAMA DIGITAL JUNIOR
Haremos clic en el primero de ellos, que es el número ‘0’ en sí, y automáticamente apa-
recerá un bloque numérico con un valor igual a cero. Enchufamos este al bloque initia-
lize_global_i_to y listo.
Como se mencionó anteriormente, vamos a utilizar la variable ‘i’ para seguir los cambios
de color asignándole un valor determinado para cada caso. En el caso del color rojo
vamos a asignarle el valor ‘1’, y para el verde, el ‘0’.
Como sucede para el caso de las propiedades, tenemos también disponibles los bloques
conocidos como getters y setters para el caso de las variables.
Los getters se utilizan para obtener el valor actual de una variable, y son aquellos en
las que comienzan con la leyenda get_ (obtener…), mientras que los setters se utilizan
para asignar un nuevo valor de una variable, y comienzan con la leyenda set_ (estable-
cer…). Ambos tipos los podemos encontrar dentro del submenú variables.
Luego de esto, veremos que sobre el bloque set_to aparece un signo de error ( ).
Este nos indica que existe algún tipo de error en la utilización de dicho bloque.
Dicho error será contabilizado junto a las advertencias en la esquina inferior izquier-
da de la ventana Viewer (sobre “hide warnings”). Estos no pueden ser ignorados, como
sí sucede con los warnings (advertencias).
Al hacer clic sobre dicho símbolo de error, nos aparecerá un globo con información
sobre lo sucedido:
39
UTN – PROGRAMA DIGITAL JUNIOR
En el presente caso, este nos indica que debemos seleccionar un ítem valido dentro
del menú desplegable. El menú al que se refiere es el que nos va a aparecer al cliquear
en la casilla que está al lado de set, la que tiene una pequeña flechita hacia abajo.
Al hacer esto nos, aparecerá una lista de las variables que tenemos en uso. Ya que la
única que hemos inicializado es la variable global ‘i’, será esta la única opción que se
nos presentará. La seleccionamos y le asignamos el valor ‘1’.
40
UTN – PROGRAMA DIGITAL JUNIOR
utilizar aquí la combinación “Ctrl + C” y “Ctrl + V” para obtener una copia del mismo, a
la que luego la asignaremos un valor igual a ‘0’.
Secuencia de tareas
Como pueden ver, en ambos espacios de tarea, tanto then como else, hemos colocado
los bloques siguiendo un orden específico. Conoceremos a estos conjuntos de bloques
como secuencia de bloques o secuencia de tareas, debido a que la App ejecutará los
mismos uno a uno y de arriba hacia abajo, o sea secuencialmente.
41
UTN – PROGRAMA DIGITAL JUNIOR
De nuevo aquí bastará con cliquear en la casilla al lado de get para que podamos selec-
cionar la variable global ‘i’. Por último, colocaremos un bloque numérico con el valor ‘0’
dentro del espacio vacío restante.
Lo que hará la App al iniciar, será crear la variable global ‘i’ y darle el
valor cero, mostrando la pantalla Screen1, en la cual aparecerá el botón
Button1 en color gris (el color por default). Mientras que no toquemos
este botón, no sucederá nada.
42
UTN – PROGRAMA DIGITAL JUNIOR
De este modo, las sentencias dentro del espacio else serán ignoradas, ya que la condi-
ción esperada por el bloque if resulta cumplirse, por lo que dicho bloque termina su
ejecución en este punto.
Adicionalmente, al no tener otros bloques que ejecutar debajo del if, también el blo-
que when_Button1.Click_do terminará su ejecución en este punto, y el programa que-
da a la espera de un nuevo evento.
43
UTN – PROGRAMA DIGITAL JUNIOR
Ya que la variable ‘i’ valdrá nuevamente cero, la próxima vez que pulsemos el botón y
se ejecute el bloque when_Button1.Click_do, el bloque if dará como resultado la eje-
cución de las sentencias incluidas en el espacio then, el botón se tornará rojo y la va-
riable ‘i’ tomará el valor uno, y así sucesivamente hasta que salgamos de la App.
Las imágenes de las pantallas con las que hemos explicado el funcionamiento de la esta
App, fueron generadas utilizando el programa emulador, el cual se instalará en nuestra
PC junto con el programa aiStarter. En el próximo módulo vamos a aprender cómo uti-
lizar el mismo.
En este módulo estudiaremos las distintas posibilidades con las que contamos dentro
de App Inventor para probar el funcionamiento de nuestras Apps, a fin de realizar lo
que en programación se conoce como depuración. Aprenderemos también sobre el uso
de múltiples pantallas dentro de una misma App, así como también conceptos de pro-
gramación referente a bloques de texto y matemáticos.
Concepto de Depuración
44
UTN – PROGRAMA DIGITAL JUNIOR
Dichas pruebas se pueden llevar a cabo dentro de un dispositivo Android físico, o bien
realizarse dentro de un software que emula un dispositivo Android virtual. A dicho
software se lo conoce como emulador.
En App Inventor contamos con 3 modos de prueba diferenciados por el tipo de dispo-
sitivo y de conexión. Estos modos de prueba son:
Nótese que todos los casos involucran el uso de una PC. Esto es debido a que la depu-
ración se realiza como parte del proceso de construcción de la App, por lo tanto es
necesario disponer de toda la información que la constituye hasta el momento.
Dicha información se encuentra dentro de App Inventor, y es por esta razón que la
depuración implica algún tipo de comunicación o enlace entre el dispositivo de prue-
bas y el entorno de desarrollo, por intermedio de la PC.
Es por medio de esta comunicación que, todos los cambios que realicemos dentro de
App Inventor sobre nuestra App, se verán automáticamente reflejados dentro del
dispositivo de pruebas.
Software Necesario
Como mencionamos en el módulo 1, para los casos en los que se vaya a utilizar un dis-
positivo Android físico, será necesario tener instalada en el mismo la “MIT AI2
Companion App”, que se puede instalar desde Google Play a través de este link:
[Link]
Adicionalmente, cuando deseemos realizar las pruebas por medio de USB o del emula-
dor, necesitaremos tener instalado en la PC el software “aiStarter”. El archivo de ins-
talación es el “AppInventor_Setup_Installer_v_2_2”, el cual podemos descargar de la
siguiente dirección:
[Link]
45
UTN – PROGRAMA DIGITAL JUNIOR
Nota: Si por alguna razón ya tuvieran instalada una versión anterior, será necesario
desinstalar dicha versión y reiniciar la máquina, antes de instalar la nueva versión.
El programa aiStarter se usa, tanto para emular las Apps dentro nuestra PC, como
para enlazar un dispositivo Android por conexión USB. Esta es la función que cumple
dicho programa, es el “puente” que une App Inventor con nuestro dispositivo Android
o emulador, permitiendo de este modo llevar a cabo la depuración.
Para comenzar, iniciemos el programa aiStarter. Al hacerlo se nos abrirá una ventana
de línea de comandos (CMD o Terminal) como la que sigue:
46
UTN – PROGRAMA DIGITAL JUNIOR
Al hacer esto veremos un cartel de que nos informa que el Emulador de Android se
está iniciando y que dicho proceso tomará unos minutos:
Cuando esto suceda, el programa aiStarter abrirá dos nuevas ventanas en las que se
ejecutará el emulador. Si su PC cuenta con un firewall, es posible que este bloque la
conexión, por lo que deberemos dar permiso para que aiStarter se conecte normal-
mente. De las dos ventanas que se abren, la que nos interesa es la siguiente:
En ella se representa una interfaz que imita todas las características básicas de un
teléfono celular con sistema operativo Android:
47
UTN – PROGRAMA DIGITAL JUNIOR
48
UTN – PROGRAMA DIGITAL JUNIOR
Una vez que la página de App Inventor constata que todo se está ejecutando correc-
tamente, que el emulador se encuentra enlazado y que se transfirió toda la informa-
ción del proyecto a la MIT AI2 Companion App, podremos ver y probar nuestro desa-
rrollo, sin necesidad de que el mismo esté terminado, lo que nos permite corregir lo
que sea necesario.
En el caso de utilizar una conexión USB para hacer las pruebas directamente en un
teléfono celular u otro dispositivo Android, será necesario instalar los drivers de di-
cho dispositivo en la computadora, para lo cual deberán referirse al manual de usuario
de sus dispositivos.
Una vez instalados los drivers del dispositivo, hay que asegurarse de que el mismo se
encuentra en modo de depuración USB. Para habilitar dicho modo, siga estos pasos:
La próxima vez que conectemos nuestro dispositivo Android a la PC, nos aparecerá un
mensaje dentro del mismo informándonos que se encuentra conectado y en modo de
depuración.
Existe una página para probar la conexión de nuestro dispositivo. La misma es:
[Link]
49
UTN – PROGRAMA DIGITAL JUNIOR
Al hacer esto veremos un cartel de que nos informa que se está estableciendo la co-
nexión USB:
Una vez establecida dicha conexión, la MIT AI2 Companion App se iniciará automáti-
camente dentro del dispositivo, al tiempo que dentro de la página de App Inventor 2
se nos informa de dicho proceso de manera similar a como sucedió con el emulador:
Una vez que la página de App Inventor constata que todo se está ejecutando correc-
tamente, que el dispositivo se encuentra enlazado y que se transfirió toda la informa-
ción del proyecto a la MIT AI2 Companion App, podremos probar la App y cambiar lo
que sea necesario.
Problemas Comunes
Pueden suceder algunos problemas al momento de realizar las pruebas. Por ejemplo,
que dentro de la página de App Inventor nos salga un cartel como el que sigue, el cual
nos informa que no se ha podido realizar el enlace:
50
UTN – PROGRAMA DIGITAL JUNIOR
Daremos clic en “Keep Trying” para volverlo a intentar. Es posible que acompañado a
esto, nos suja el siguiente mensaje, informándonos que la MIT AI2 Companion App no
responde:
Daremos clic en “Wait” para darle tiempo a la MIT AI2 Companion App a que salga de
este estado y se comunique correctamente con la página de App Inventor.
También, puede suceder que App Inventor les informe que la MIT AI2 Companion
App se encuentra desactualizada:
En muchos casos, no hará falta que actualicemos dicha aplicación para que la ejecución
del proyecto que deseamos probar funcione correctamente, por lo que bastará con
hacer clic en “Not Now”. En caso contrario, haremos clic en “OK” para que se inicie la
actualización. Nos aparece la el siguiente mensaje informándonos que se está descar-
gando la nueva versión:
51
UTN – PROGRAMA DIGITAL JUNIOR
Cuando esto suceda, veremos que dentro del dispositivo Android o emulador (según
sea el caso), se nos informará que la MIT AI2 Companion App será reemplazada por
otra versión. Daremos clic en OK y luego en Install para proceder:
A su vez, dentro de App Inventor se nos informará que la nueva versión de la MIT
AI2 Companion App está siendo instalada dentro del nuestro dispositivo (o emula-
dor), por lo que deberemos revisarlo con el fin de permitir dicha instalación, que es lo
que hicimos en el paso anterior:
52
UTN – PROGRAMA DIGITAL JUNIOR
Dentro de la ventana anterior, daremos clic en “Got It” y procedemos a realizar los
dos pasos mencionados. Primero, seleccionaremos “Done” dentro del dispositivo o del
emulador:
Para realizar las pruebas a través de Wifi, sólo nos hará falta contar con la MIT AI2
Companion App, lo que significa que no tendremos necesidad de iniciar el programa
aiStarter.
Tanto la PC como el dispositivo Android tienen que estar conectados a la misma red
Wifi, o en el caso de la PC, conectada a la misma red por medio de un cable Ethernet
53
UTN – PROGRAMA DIGITAL JUNIOR
al cable modem o router genera la señal de Wifi, el cual vamos a utilizar para conec-
tar nuestro dispositivo Android.
Una vez dentro de App Inventor, abrimos el proyecto de la App que deseamos probar,
cliqueamos sobre el menú Connect, y seleccionamos la opción AI companion:
Nos aparecerá un mensaje que nos dice que debemos iniciar la MIT AI2 Companion
App, un código QR (un cuadrado con varios pixeles) y un código de 6 caracteres:
Los códigos QR sirven para almacenar y transferir información como lo hacen los có-
digos de barras. Para poder “leerlo”, necesitamos tener instalada en nuestro disposi-
tivo alguna aplicación de escaneo de códigos QR, como por ejemplo Googles de Goo-
gle, QR code reader o cualquier otra de las que podemos encontrar en Google Play.
Una vez instalada cualquiera de estas aplicaciones de escaneo, abrimos la MIT AI2
Companion App y seleccionamos la opción “scan QR code”. Se nos abrirá automática-
mente dicha App de lectura, la cual usaremos para escanear la imagen del código QR
que nos aparece dentro de App Inventor:
54
UTN – PROGRAMA DIGITAL JUNIOR
55
UTN – PROGRAMA DIGITAL JUNIOR
Proyecto 02
Entre los componentes que van a integrar esta nueva App, podemos encontrar algunos
del tipo Label (etiqueta) y otros del tipo TextBox (casilla de texto), los cuales encon-
traremos dentro del menú User Interface.
El componente Label nos permitirá mostrar un texto en pantalla con sólo ingresarlo
dentro del Designer en su propiedad Text, o modificarlo dentro del Editor de Blo-
ques.
El componente TextBox es similar al Label, con la diferencia que el usuario será capaz
de ingresar el texto que desee, por medio de un teclado que aparecerá al tocar la
pantalla sobre dicho componente.
56
UTN – PROGRAMA DIGITAL JUNIOR
Entre las propiedades de los TextBoxes encontraremos una llamada “Hint” (sugeren-
cia). Su función es la de permitir el ingreso de un texto breve, que indique cual es el
uso que se le dará a dicho TextBox dentro de la App.
Al iniciarse la App, y mientras que no se ingrese un nuevo texto, veremos que dentro
de estas “TextBoxes” se lee el texto de hint en color gris claro, de modo que el usua-
rio tenga una idea de cuál es la función que cumple dicha casilla. Una vez ingresado el
nuevo texto, este reemplazará a la sugerencia, pudiéndose leer el mismo en color ne-
gro.
Continuando con el diseño, hemos colocado en medio de estas casillas de texto una
serie de botones, destinados a realizar la operación indicada en cada caso, alineados
dentro de un HorizontalArragements. Más abajo y dentro de otro HorizontalArrage-
ments, colocamos dos Labels donde se mostrará el resultado de la operación elegida.
57
UTN – PROGRAMA DIGITAL JUNIOR
A continuación se muestra una imagen en la que hemos utilizado las cuatro operaciones
matemáticas básicas dentro de sendos bloques when_”operación”.Click. Dichos blo-
ques matemáticos se encuentran dentro de menú Math.
Como se puede apreciar en la imagen, tanto el bloque “suma” como el bloque “producto”
son mutadores, ya que cuentan con el símbolo en su parte superior izquierda (no
así los bloques “resta” y “división”).
Por esta razón, cuando necesitemos sumar o multiplicar más de dos números, podre-
mos hacer uso de esta función especial.
58
UTN – PROGRAMA DIGITAL JUNIOR
Ahora vamos a colocar una nueva pantalla a nuestra App. Lo haremos cliqueando sobre
el botón Add Screen dentro del entorno de diseño:
La podremos nombrar como queramos. En nuestro caso lo dejaremos como esta y da-
remos clic en OK. Esta nueva pantalla la vamos a usar para hacer un contador de ca-
racteres. Lo que hará será contar la cantidad de caracteres de un texto que se ingre-
sará en un TextBox. Aquí el diseño:
59
UTN – PROGRAMA DIGITAL JUNIOR
Y esta es la programación:
Hemos utilizado para la programación de esta segunda pantalla los bloques is_empty y
length.
El bloque is_empty nos devuelve un valor igual a true (verdadero) si es que el texto
que recibe está (o es igual a) “vacío”, mientras que devolverá un valor igual a false
(falso) en caso contrario.
El bloque length que nos devuelve el largo en caracteres de un texto recibido. Si dicho
texto es igual a “vacío”, el valor devuelto será igual a “cero”.
Cambio de Pantalla y Cierre de la App
Esta aquí está todo muy bien, pero si dejamos la App de esta forma, no podremos ac-
ceder a esta segunda pantalla, a menos que agreguemos algunos elementos destinados
para tal fin. Colocaremos además otros elementos que permitirán el cierre de la App.
60
UTN – PROGRAMA DIGITAL JUNIOR
Los bloques que vamos a necesitar son el bloque open_another_screen (abrir otra pan-
talla) y el bloque close_application (cerrar aplicación), ambos los cuales se encuentran
dentro del menú Control.
Para hacer uso de los bloques mencionados, vamos a necesitar algún evento que los
dispare. Por esta razón, vamos a colocar un par de botones más, tanto a la primera
pantalla como a la segunda. La intención es usarlos para pasar de una a otra pantalla o
salir de la aplicación, según sea el caso.
61
UTN – PROGRAMA DIGITAL JUNIOR
Nótese aquí que el nombre de los botones de dos pantalla distintas puede ser idéntico,
debido a que, como dijimos anteriormente, la programación para cada pantalla se reali-
za de forma separada.
62
UTN – PROGRAMA DIGITAL JUNIOR
Vamos a crear una pequeña App cuyo propósito será generar una lista de números
aleatorios. Con esto en mente y ya dentro del entorno de diseño, vamos a cambiar el
título de la pantalla de Screen1 por el de “Números Aleatorios”.
Nótese aquí, que si bien, no es posible utilizar caracteres con tilde como parte del
nombre de un componente (o, de por ejemplo, una variable dentro del editor de blo-
ques), si es posible hacerlo cuando se trata del título de una pantalla o el texto de un
botón.
63
UTN – PROGRAMA DIGITAL JUNIOR
Programación
Ya dentro del entorno de programación por bloques, crearemos dos variables, una a la
cual llamaremos “Numero” e inicializaremos con un valor igual a ‘0’, y la otra a la cual
vamos a dar el nombre de “Lista”. Esta última variable será justamente eso, una lista
en la cual iremos colocando los números generados aleatoriamente.
Las variables del tipo list (lista) son un caso especial de variable, parecida a un vector,
en la cual cada uno de los elementos de dicha lista tiene un índice (index) o número
asociado, el cual indica su posición dentro de la misma.
Este índice no forma parte de la lista como carácter visible, sino que es interno al
programa, por lo que no debemos preocuparnos por confundir a dicho index con los
números que vamos a guardar como información dentro de la misma.
Para definir a una variable como del tipo list, necesitamos terminar la inicialización de
la misma colocando el bloque create_empty_list (crear una lista vacía), el cual encon-
traremos dentro del submenú Lists (listas), al principio del mismo:
Dentro del espacio de tareas del bloque when_Generador.Click colocaremos otro blo-
que de control, en este caso uno del tipo while_test…do (mientras se cumpla la condi-
ción… hacer…) el cual se encuentra dentro del submenú Control.
La función de dicho bloque “while” será la de realizar una serie de tareas de forma
repetitiva, hasta el momento en el que una condición dada deje de cumplirse.
Dicha función, así como también la que cumple el bloque for, resulta de gran utilidad
en programación, por lo que podremos encontrar ejemplos de dichas funciones en
otros lenguajes de programación, donde se los conoce como bucles o ciclos.
64
UTN – PROGRAMA DIGITAL JUNIOR
La condición que vamos establecer para nuestro bloque while, será la comparación nu-
mérica entre el valor de la variable Numero y un valor igual a ‘cero’, pero en este ca-
so, haremos uso del bloque ‘desigual’, el cual obtendremos de modificar el bloque ‘igual’
que se encuentra dentro del submenú Math.
Para esto, cliqueamos sobre el signo ‘=’ de dicho bloque, lo que nos desplegará un menú
en el cual seleccionamos el signo desigual, como podemos ver en la siguiente imagen:
Ahora, vamos a colocar dentro del while los bloques que necesitamos, tanto para gene-
rar los números aleatorios como para ir guardándolos dentro de la Lista. Para esto,
colocaremos primeramente un bloque set_global_Numero_to.
65
UTN – PROGRAMA DIGITAL JUNIOR
el cual encontraremos dentro del menú Math. Este será el encargado de generar los
números aleatorios para la lista.
Como deseamos que el rango de números generados vaya del 1 al 10, modificaremos el
valor del bloque numérico que viene preasignado de ‘100’ a ‘10’. El de valor ‘1’ lo deja-
mos tal como está.
Haremos esta pequeña modificación para acotar el rango de valores a generar, aunque
podríamos dejarlo como está sin mayores problemas, o incluso elegir un rango de valo-
res más amplio.
Colocaremos este conjunto de bloques dentro del área de tareas del bloque while, de
manera que nos quede de la siguiente forma:
A continuación, vamos a explicar paso a paso el comportamiento del bloque while den-
tro del bloque when_Generador.Click para que podamos entender lo hecho hasta el
momento:
66
UTN – PROGRAMA DIGITAL JUNIOR
ción, se procederá a ejecutar lo que sea que se encuentre dentro del espacio de
tareas (do) de dicho while.
67
UTN – PROGRAMA DIGITAL JUNIOR
8. Esto seguirá sucediendo así, hasta el momento en que el valor que se le asigne a
Numero sea igual a ‘1’, momento en el cual cesará la ejecución del while, y se
procederá a ejecutar lo que se encuentre debajo de él.
En otros entornos de programación esto puede resultar útil (se llega incluso a estable-
cer dicha condición de control directamente como true), pero debido a que la progra-
mación en App Inventor está orientada a eventos, no resulta conveniente hacer esto.
Debido a esto, necesitamos una forma de almacenar dichos números para luego mos-
trarlos. Para esto vamos a utilizar la variable Lista que creáramos previamente.
A ella vamos a asignar uno a uno los números a medida que se vayan generando. Dicha
asignación se lleva a cabo con el uso del bloque add_items_to_list, el cual encontramos
como parte del conjunto de bloques del tipo Lists, dentro de la columna Blocks.
68
UTN – PROGRAMA DIGITAL JUNIOR
Este último requiere que le informemos dos parámetros: la lista a utilizar y el ele-
mento a agregar.
El elemento a agregar puede ser cualquier valor numérico o lógico, palabra, carácter o
cadena de caracteres que necesitemos guardar, por lo que podremos asignar direc-
tamente como ítem el valor de nuestra variable Número.
Lo que sucederá al mostrar nuestra lista en pantalla será que los números aparecerán
separados tan sólo por un espacio. Lo que nos interesaría lograr es que los mismos apa-
rezcan separados a su vez por una coma.
Para lograr esto, y sabiendo que los elementos que podemos guardar en la lista inclu-
yen a cualquiera de los caracteres del teclado, lo que haremos será una unión entre el
número generado y el carácter ‘,’.
Usaremos para esto el bloque join, que sirve para unir dos o más cadenas de textos
dadas (ya que es del tipo mutador y se le pueden agregar más entradas). Una vez eje-
cutado, devuelve una cadena de caracteres formada por las cadenas a él asignadas.
Podremos encontrar dicho bloque dentro del menú Text, dentro de la columna Blocks.
Lo hemos utilizado aquí de la manera antes mencionada:
69
UTN – PROGRAMA DIGITAL JUNIOR
Nota: Si bien el bloque join está pensado para unir dos o más textos, no existe pro-
blema alguno en asignarle una variable numérica, ya que App Inventor realizará auto-
máticamente la conversión necesaria.
Vamos a agregar ahora los bloques que necesitamos para mostrar nuestra Lista en
pantalla. Esto lo haremos a continuación del while, de manera que la misma ya se en-
cuentre cargada con todos los números que se generaron.
Lo que haremos será asignarle dicha lista a la propiedad Text de la Label “Números”,
utilizando el bloque set_Numeros.Text:
Luego de esto, necesitaremos “vaciar” nuestra Lista para poder reutilizarla la próxima
vez que se presione el botón Generar, de modo que podamos obtener un nuevo conjun-
to de números en pantalla. Lograremos esto asignándole una nueva copia del bloque
create_empty_list a la variable Lista.
Podemos duplicar dicho bloque haciendo clic derecho sobre el anteriormente utilizan-
do y seleccionando la opción duplicate:
70
UTN – PROGRAMA DIGITAL JUNIOR
Luego, procederemos a asignarle este duplicado a la variable Lista por medio del blo-
que set_global_Lista_to:
Esto se debe a que, como habrán notado, al salir de dicho while, el valor de “Numero”
queda en ‘1’, lo que impediría que se vuelva a ejecutar en cualquier otro momento.
Colocaremos todos los bloques que acabamos de mencionar debajo de nuestro while,
para que se ejecuten a continuación de este, pero antes de que culmine la ejecución de
when_Generador.Click.
71
UTN – PROGRAMA DIGITAL JUNIOR
Como habrán notado en el ejemplo anterior, el listado numérico tendrá un largo que
variará según el momento en el cual, el bloque random_integer_from_1_to_10 genera
un valor igual a ‘1’.
Para “salvar” esta condición, vamos llevar a cabo algunas modificaciones a lo antes rea-
lizado, a fin de mostrar además, que es posible resolver un mismo problema con distin-
tas soluciones.
72
UTN – PROGRAMA DIGITAL JUNIOR
Para evitar perder lo que ya hemos conseguido hasta el momento, vamos a crear una
copia del proyecto anterior. Para esto, ingresamos a dicho proyecto, cliqueamos en el
menú Projects, y seleccionamos la opción Save project as…
Nos aparecerá un cuadro de diálogo, en el cual podremos ingresar el nombre del nuevo
proyecto. Una vez ingresado el texto, presionamos en OK y el proyecto se guardará
con ese nombre.
Este será un proyecto nuevo, totalmente aparte del original. Todo lo que hecho ante-
riormente quedará intacto con su anterior nombre.
73
UTN – PROGRAMA DIGITAL JUNIOR
Al cliquear sobre dicho conjunto y colocarlo sobre dicho tacho, este se “abrirá” para
que al soltarlo aquí (soltando clic), los bloques sean eliminados.
Como mencionamos más arriba, vamos a reemplazar la variable global Número por
otra del tipo Local. Para crear dicha variable local, necesitamos utilizar un bloque del
tipo initialize_local_name_to, el cual encontraremos dentro del menú Variables.
74
UTN – PROGRAMA DIGITAL JUNIOR
Como mencionamos en módulos anteriores, las variable locales son sólo visibles dentro
del bloque en el que se las creo, y una vez fuera de este, la variable desaparece junto
con su valor. Cuando el bloque vuelve a ser ejecutado, la variable vuelve a ser iniciali-
zada, y en el presente caso, con un valor igual a cero.
Debido a esto, no será necesario tener en cuanta (ni modificar) el valor de la nueva
variable Numero antes de salir del bloque when_Generador.Click, lo cual sí era nece-
sario cuando se trataba de una variable global.
En este caso, resulta algo trivial esta modificación, pero a la hora de crear programas
de mayor complejidad, nos puede ahorrar el dolor de cabeza que representa el no te-
ner en cuenta lo que sucede con la variable al salir de un bloque, cuando esta es global.
Dentro de dicho bloque encontramos a “number”, la cual es una variable local propia e
interna al bloque for. A pesar de esto, podremos renombrarla como nos resulte conve-
niente, así como también podremos modificar los valores asignados a sus encastres
from, to y by.
Podríamos traducir “for each number from… to… by… do…” como: “Para cada núme-
ro, desde… hasta… en pasos de a…, hacer…”. A continuación explicaremos como es
75
UTN – PROGRAMA DIGITAL JUNIOR
el funcionamiento, paso por paso, para dicho bloque for, de manera que todo esto re-
sulte más claro.
2. Al terminar de ejecutar los bloques que están dentro del área de tareas, se in-
crementa a number en un valor igual al del encastre by, que en este caso es
igual a ‘1’, por lo que number pasará a valer ‘2’.
3. Luego, los bloques dentro del área de tareas son ejecutados nuevamente, esta
vez para (for) un valor de number igual a ‘2’. A esto es a lo que nos referimos
con la expresión “para cada número” (o “for each number”).
76
UTN – PROGRAMA DIGITAL JUNIOR
5. Los bloques dentro del área de tareas (do) son ejecutados nuevamente, esta
vez para un valor de number igual a ‘3’. Al terminar de ejecutar dichos bloques,
se volverá a incrementar number en ‘1’, para luego, volver a ejecutar los blo-
ques que hay dentro el espacio do.
Esto seguirá así, hasta el momento en el cual number alcance un valor igual al
que se encuentra en el encastre to, que en este caso es igual a ‘5’:
6. Luego de esta última ejecución (para number igual a ‘5’), el programa “saldrá”
del for, y continuará con la ejecución de los bloques que se encuentren debajo
de este.
Como podemos ver, el bloque for nos permite repetir una serie de tareas, de manera
similar a como lo haría un while, pero en lugar de evaluar el valor de verdad de una
condición dada, evalúa el valor de una variable destinada para esta función.
En nuestro caso vamos a renombrar la variable number como ‘N’, a fin de que no resul-
te tan similar a la local “Numero”. Así mismo, podríamos ponerle cualquier otro nom-
bre, sin que esto afecte a la funcionalidad antes descripta.
77
UTN – PROGRAMA DIGITAL JUNIOR
Continuando con la programación, y una vez que hayamos intercambiado el bloque while
por el bloque for (de la manera que se describió más arriba), podremos observar que
los bloques set_Numero_to y get_Numero presentarán sendos signos de error ( ).
Esta es la forma en la que App Inventor nos advierte que dichos bloques están “fuera
de lugar”. De cualquier forma, dichos errores desaparecerán una vez que coloquemos
nuestro for dentro del bloque when_Generador.Click, que es el que contiene a la va-
riable local Numero.
La otra secuencia de bloques que vamos a reutilizar es la que se encontraba debajo del
bloque while. De dicha secuencia eliminaremos al conjunto set_global_Numero_to=0,
por lo que la misma nos quedara de la siguiente forma:
78
UTN – PROGRAMA DIGITAL JUNIOR
Si durante la construcción de alguna de las Apps que hasta aquí les presentamos, han
podido enlazar sus dispositivos Android (o emulador) a la página de App Inventor, ha-
brán notado que las mismas han estado funcionando en tiempo real dentro de dicho
dispositivo, o sea, se han ido “armando” dentro del mismo.
Pero lo deseable es tener la App en ejecución sin tener que estar conectados a App
Inventor. Para esto necesitamos empaquetar dicha aplicación, de manera que obten-
gamos un archivo "paquete", cuya extensión será del tipo .apk.
Para realizar el empaquetado de una aplicación, haremos clic en el menú Build, dentro
de la barra gris que se encuentra en la parte superior de la pantalla. Dentro de este
menú, tendremos dos opciones posibles; “App (provide QR code)” y “App (save to my
computer)”:
Una vez que hayamos cliqueado cualquiera de las dos opciones, nos aparecerá una ven-
tana con una barra de progreso que nos indicará que la aplicación está siendo empa-
quetada.
79
UTN – PROGRAMA DIGITAL JUNIOR
En el caso de haber optado por cliquear en App (provide QR code), se nos presentará
en pantalla un código QR, con el cual vamos a poder instalar la App directamente den-
tro de aquellos dispositivos que cuenten cámara de fotos y conexión a internet.
Para poder utilizar esta opción, será necesario contar con alguna aplicación de escaneo
de códigos QR, tal como Googles o cualquier otra de las que se encuentran disponibles
gratuitamente en Google Play. Una vez realizada la instalación, daremos clic en OK
para continuar.
Nota: el código QR funcionará sólo con aquellos dispositivos que tengan asociada la
misma cuenta de Google que la utilizada dentro de App Inventor.
Por otro lado, si optado por la opción App (save to my computer), vamos a poder des-
cargar la App a nuestra PC en la forma de un archivo del tipo .apk, el cual podremos
compartir con otras personas, sin necesidad de que estas hagan uso de App Inventor.
Una vez que hayamos cliqueado en dicha opción y de que el proceso de empaquetado
haya terminado, nuestro navegador nos preguntará si queremos descargar un archivo
de nombre “Project_name”.apk, donde “Project_name” será el nombre que le hayamos
dado al proyecto.
80
UTN – PROGRAMA DIGITAL JUNIOR
Luego, utilizando alguna de muchas las aplicaciones de exploración archivos que pode-
mos encontrar gratuitamente en Google Play, intentaremos abrir dicho “archivo”.apk.
Para esto, vamos a construir una App que nos permitirá dibujar en la pantalla del telé-
fono con diferentes colores.
81
UTN – PROGRAMA DIGITAL JUNIOR
La App que vamos a construir se llamará PaintPot, en honor a uno de los primeros pro-
gramas que se desarrollaron en la década de 1970, el cual demostraba el gran poten-
cial de las computadoras personales. La aplicación cumplirá los siguientes requisitos:
Diseño y Configuración
Para comenzar con el armado de la App, vamos a necesitar los siguientes elementos:
Cuatro botones: Tres botones para la selección del color; uno rojo, otro azul,
y uno verde; más un botón adicional para limpiar o borrar el dibujo.
Un componente Canvas, el cual proveerá la superficie sobre la cual dibujar.
Dentro de dicho componente podremos colocar una imagen de fondo.
Un componente HorizontalArrangement, para hacer que los tres botones de
color aparezcan alineados.
82
UTN – PROGRAMA DIGITAL JUNIOR
[Link]
Empecemos por cambiar el título de la pantalla. Para esto, deberán seleccionar el com-
ponente Screen1 dentro del panel Components. Luego, dentro del panel Properties
encontraremos la propiedad Title (título). En ella escribiremos el texto "PaintPot".
Hay tres elementos dentro de App Inventor a los cuales se puede considerar como
títulos o nombres, y es fácil confundirlos:
1. El nombre que elegimos para el proyecto en el cual hemos de trabajar (en este
caso, PaintPot). Este será también el nombre de la App, para el caso en que se
la empaquete en un archivo de instalación con extensión “.apk”.
2. El nombre del componente, el cual aparece dentro del panel Components, en es-
te caso "Screen1", que es el nombre del componente pantalla. De momento no
es posible cambiar el nombre del primer componente de pantalla, pero sí se
pueden crear nuevas pantallas, a las cuales se les podrá cambiar el nombre de
componente.
Resumiendo esto último, el nombre y el título del componente Screen1 son inicialmen-
te iguales, pero podremos cambiar el título, modificando la propiedad Title.
Como mencionamos en el módulo uno, para poder utilizar los archivos que deseemos
dentro de nuestras Apps, primero necesitamos subirlos al entorno de trabajo. Para
esto, cliquearemos sobre el botón Upload File… que se encuentra dentro del cuadro
Media.
83
UTN – PROGRAMA DIGITAL JUNIOR
Al hacerlo, nos aparecerá un cuadro de dialogo, el cual nos permitirá buscar dentro de
la PC los archivos que deseamos integrar a nuestra App, por medio del uso del botón
Examinar o Browse.
Al cliquear sobre dicho botón, se nos abrirá una ventana de exploración de archivos,
donde podremos seleccionar el archivo de deseado. Una vez seleccionado el archivo,
daremos clic en aceptar, para retornar nuevamente al cuadro de diálogo, donde nos
aparecerá el nombre del archivo que vamos a subir:
Adicionalmente, podremos ver que dentro del cuadro Media nos aparece el listado de
los archivos cargados. Esto es válido tanto, dentro del entorno de diseño, como dentro
del editor de bloques.
84
UTN – PROGRAMA DIGITAL JUNIOR
Continuando con el diseño, procederemos a colocar el botón para el color rojo. Luego,
modificaremos su texto para que dentro de él se lea la palabra “Rojo”. Modificaremos
también la propiedad BackgroundColor para que se vea del color correspondiente.
Como explicamos más arriba, existen distintos tipos elementos que podemos entender
como nombres dentro de App Inventor. Lo que nos interesa modificar ahora es el
nombre el componente Button1.
Para esto, necesitamos seleccionar el componente deseado, es este caso Button1, den-
tro del panel Components. Veremos que más abajo y dentro del mismo panel encontra-
remos el botón Rename… (Renombrar).
Al cliquear sobre dicho botón, se nos presentará una ventana donde podremos ingresar
el nuevo nombre dentro de la casilla “New name”.
En nuestro caso, renombraremos dicho botón de Button1 a "BotonRojo". Una vez in-
gresado el nuevo nombre, daremos clic en OK y listo; podremos corroborar el cambio
de nombre dentro del panel Components.
Del mismo modo, vamos a colocar otros dos botones; uno para el color azul y otro para
el verde, a los cuales renombraremos como “BotonAzul" y "BotonVerde" respectiva-
mente. Modificaremos además la apariencia de los mismos de manera similar a como lo
hiciéramos con el BotonRojo.
85
UTN – PROGRAMA DIGITAL JUNIOR
El entorno Designer nos debería quedar de manera similar a como aparece a continua-
ción, con los nombres los componentes Buttons cambiados. El uso de nombres signifi-
cativos hace que los proyectos sean más legibles y fáciles de entender a la hora de
revisarlos y/o programarlos.
Uso de Arrangements
De momento tendremos tres botones, alineados uno encima del otro. El siguiente paso
es hacer que estos se alineen horizontalmente. Para ello, utilizaremos el componente
HorizontalArrangement (alineación horizontal).
Nota: Al mover un componente dentro de la pantalla, veremos una línea de color azul
que nos indicará donde quedará situada la pieza al momento de soltarla. Utilice dicha
guía para lograr el orden deseado.
86
UTN – PROGRAMA DIGITAL JUNIOR
Si miramos en la lista de componentes del proyecto, veremos que los tres botones
aparecen ahora debajo del componente TresBotones, con un espacio de sangría. Esto
quiere decir que los botones son ahora “subcomponentes” de TresBotones.
Observemos además que todos los componentes aparecen a su vez sangrados debajo
de Screen1, o sea que son subcomponentes de dicha pantalla.
En general, los distintos tipos de “Arrangements” se utilizan para crear diseños senci-
llos, pero se pueden crear diseños más complejos, colocando varios de estos, unos den-
tro de otros.
Muchas de sus propiedades pueden ser ajustadas tanto dentro del Designer como del
editor de bloques. Conviene aclarar que la unidad de medida de las propiedades Width
(Ancho) y Height (Alto) es el píxel, por lo que los valores a asignar deben ser positi-
vos.
87
UTN – PROGRAMA DIGITAL JUNIOR
Podemos especificar un punto cualquiera dentro del Canvas como un par ordenado (X,
Y), donde ‘X’ será la distancia en píxeles desde el borde izquierdo del Canvas al punto,
mientras que ‘Y’ será la distancia en píxeles desde el borde superior al mismo punto.
En nuestro caso vamos a utilizar el componente Canvas para que el usuario dibuje den-
tro del mismo. Dicho componente se encuentra en la columna Palette, dentro del menú
“Drawing and Animation”. Lo tomamos y arrastramos hacía Screen1.
Colocaremos ahora el archivo “[Link]” como imagen de fondo. Para esto, nos diri-
giremos hacía la propiedad BackgroundImage y haremos clic sobre "None…". Se nos
desplegará una pequeña ventana dentro de la cual podremos seleccionar dicho archivo,
siempre y cuando lo hayamos cargado previamente.
Pueden utilizar cualquier imagen que deseen, pero para conseguir los mejores resulta-
dos, el tamaño de la imagen debe ser cercano al tamaño del Canvas (en píxeles). Ade-
más, cuanto mayor sea el tamaño de la imagen, mayor será el tiempo que tardará en
cargarse, y podrían exceder la capacidad de memoria que el teléfono le asigna a las
Apps.
88
UTN – PROGRAMA DIGITAL JUNIOR
Como ya dijimos, vamos a utilizar nuestro Canvas a fin de que el usuario pueda dibujar
dentro del él. Por esta razón, vamos a necesitar hacer uso del bloque de control de
evento when_CanvasDeDibujo.Touched, el cual se dispara al hacer un “toque” sobre
algún punto de nuestro Canvas.
Dentro de dichos eventos, podremos colocar algunos de los bloques que nuestro Can-
vas tiene disponible, como por ejemplo el bloque call_CanvasDeDibujo.DrawLine, el
cual nos permitirá dibujar una línea recta desde el punto inicial (x1,y1) al punto final
(x2,y2).
89
UTN – PROGRAMA DIGITAL JUNIOR
Concepto de Argumento
Por otro lado, existen otro tipo de bloques de control de eventos, los cuales nos de-
volverán información adicional sobre el evento en particular. Dicha información estará
almacenada dentro de lo que conocen como “Argumentos”.
Los argumentos funcionan como variables locales internas al bloque del evento parti-
cular, y su valor inicial dependerá del lugar y el momento en que dicho evento haya
sucedido.
Podemos ver ejemplos de este concepto tanto dentro del bloque de control de eventos
when_CanvasDeDibujo.Touched, como del bloque when_CanvasDeDibujo.Dragged.
Los mismos aparecen en la parte superior de los bloques mencionados, dentro de una
serie de casillas de color naranjas, las que contienen el nombre de cada uno de los
argumentos.
Para operar con dichos argumentos, podemos utilizar los getters y setters que apare-
cen disponibles dentro del menú Variables, como lo hemos hecho hasta el momento
para cualquier otra variable.
90
UTN – PROGRAMA DIGITAL JUNIOR
Sin embargo, podremos acceder también a ellos posicionando el cursor del mouse so-
bre el nombre del argumento deseado, y seleccionando el bloque necesario dentro del
menú desplegable que se nos presentará.
Algunos de los bloques que acabamos de describir, pertenecen a lo que en App Inven-
tor se conoce como bloques de comando. Dichos bloques se caracterizan por comenzar
con la palabra “call” (llamada) y por su color purpura, el cual coincide con el de los blo-
ques de procedimiento, ya que su uso es similar.
Los bloques de comando especifican una determinada acción a realizar. Estos bloques
se colocan dentro de la sección de tareas (do) de los bloques de control por eventos,
de manera que cuando se produzca el evento esperado, se “llame” al bloque de coman-
do para realizar la acción deseada.
Otra forma en que se conoce a estos bloques dentro de App Inventor es con el nom-
bre de Method o Método.
Programación de la App
Comenzaremos por establecer las secuencias de bloques que necesitaremos para que
el usuario pueda modificar el color con el que se ha de dibujar.
Para ello, nos dirigiremos a la columna Blocks, cliquearemos sobre el menú “BotonRojo”
y seleccionaremos el bloque when_BotonRojo.Click. Luego, dentro del menú Canvas-
91
UTN – PROGRAMA DIGITAL JUNIOR
Vamos ahora a ver los pasos que necesitamos seguir para dibujar dentro de nuestro
Canvas. La secuencia de bloques deberá ser tal que al tocar dentro del mismo, se di-
buje un punto donde se realizó el toque, mientras que si se desliza el dedo lentamente,
se dibuje una línea.
Dibujando un Círculo
Los dos primeros argumentos representarán las coordenadas ‘x’ e ‘y’ del punto donde
ocurrió el contacto, mientras que touchedSprite hace referencia a un componente que
veremos más adelante.
Lo que necesitamos lograr, es que cuando este evento se produzca, dentro del Canvas
se dibuje un pequeño círculo, con centro en las coordenadas (x, y). Por dicha razón,
vamos a seleccionar el bloque [Link] y lo colocaremos den-
tro de la sección de tareas del bloque [Link].
92
UTN – PROGRAMA DIGITAL JUNIOR
Para los parámetros ‘x’ e ‘y’ vamos a utilizar los valores de los argumentos suministra-
dos por el bloque [Link]. Para esto, colocaremos el cursor
del mouse sobre el argumento ‘x’, seleccionamos el bloque get_x dentro del menú des-
plegable, y lo colocamos en el encastre ‘x’ del bloque [Link].
Haremos lo mismo con el argumento ‘y’.
También tendremos que especificar el radio del círculo a dibujar. Cinco (píxeles) es un
buen valor para nuestra App. Si hacemos clic en un área vacía de la ventana Viewer,
escribimos el número ‘5’ y presionamos enter, crearemos un bloque de numérico para
este valor. Luego, colocamos dicho el bloque numérico en el encastre r.
93
UTN – PROGRAMA DIGITAL JUNIOR
Continuando con la programación, vamos a agregar los bloques que necesitamos para
que al deslizar el dedo, se dibuje una línea. Para cumplir con la tarea, vamos a utilizar
un bloque when_CanvasDeDibujo.Dragged, el cual encontraremos en el menú Canvas-
DeDibujo. Dicho bloque cuenta con seis argumentos.
Dichos argumentos representan a tres pares de coordenadas (x, y), las cuales descri-
ben, respectivamente:
Colocaremos ahora los bloques que necesitamos para dibujar una línea. Dentro del me-
nú CanvasDeDibujo encontraremos el bloque [Link]. Lo selec-
cionamos y lo colocamos dentro del área de tareas del bloque
[Link].
94
UTN – PROGRAMA DIGITAL JUNIOR
Al arrastrar el dedo sobre la pantalla, describiendo por ejemplo una línea curva, lo que
sucede en realidad es que se irán dibujando cientos de pequeñas líneas rectas entre
cada punto del recorrido: cada vez que se mueve el dedo, aunque sea por muy poco, se
extenderá la línea graficada desde la última posición que ocupó el dedo hasta la posi-
ción inmediatamente posterior, y así sucesivamente.
Borrando lo Dibujado
Por último, vamos a configurar el botón Borrar. Dentro de la columna Blocks, cliquea-
remos sobre el menú BotonBorrar, para luego seleccionar el bloque
when_BotonBorrar.Click. Luego cliqueamos sobre CanvasDeDibujo, seleccionamos el
bloque call_CanvasDeDibujo.Clear y lo colocamos en la sección de tareas de
when_BotonRojo.Click.
Recordemos que esta acción sólo borrará aquello que el usuario haya dibujado, dejando
intacta la imagen de fondo del CanvasDeDibujo.
95
UTN – PROGRAMA DIGITAL JUNIOR
96
UTN – PROGRAMA DIGITAL JUNIOR
En este módulo vamos a aprender sobre el uso de los compontes del tipo media (multi-
media) y del tipo storage (almacenamiento), así como también algunos del tipo User
Interface que nos serán de particular utilidad para con los dos primeros tipos.
La idea de esta App es utilizar la imagen de un gatito, la cual al ser tocada por el usua-
rio reproducirá el sonido de un "miau", para simular el maullido de un gato en respues-
ta a una caricia.
Con este fin, vamos a necesitar hacer uso de dos archivitos: un archivo de imágenes
con la foto del gatito, y un archivo de audio con el sonido de un "miau", los cuales he-
mos colocado a continuación, para que puedan copiarlos a su PC:
[Link] Miau!.mp3
Como primer paso del diseño, colocaremos un componente Button dentro del cual va-
mos a mostrar la imagen del gatito. Utilizaremos dicho Button para disparar la repro-
ducción del “Miau”. Para esto, luego de colocar dicho componente Button(1), iremos a
la columna Propierties, y dentro de la propiedad Image, haremos clic donde dice “No-
ne…”(2):
97
UTN – PROGRAMA DIGITAL JUNIOR
Al hacer esto, se nos desplegará una ventana o menú, dentro de la cual tendremos la
posibilidad de seleccionar el archivo de imagen que deseamos para Button1, siempre y
cuando lo hayamos subido son anterioridad.
De no ser así, veremos que la lista de archivos disponibles estará vacía. En ese caso,
podemos cliquear sobre el botón “Upload File…”(2), el cual nos aparecerá dentro de
dicha ventana o menú.
Una vez cliqueado, nos aparecerá un cuadro de dialogo similar al descripto anterior-
mente, donde al cliquear sobre Browse, podremos para ubicar al archivo “[Link]”
dentro de nuestra PC (3).
Seleccionamos este archivo, damos clic en Abrir y a continuación en "OK". Una vez
completada la subida, dicho archivo se establecerá automáticamente como imagen de
fondo para Button1.
Cabe aclarar que si bien en este caso, la subida del archivo se ha realizado dentro de
la columna Properties y para un componente determinado, este parecerá como parte
del listado del cuadro Media y estará disponible para usarlo dentro de cualquier otro
componente que queramos.
98
UTN – PROGRAMA DIGITAL JUNIOR
Por otro lado, si sucede que la imagen aparece incompleta, podremos solucionar esto
modificando las propiedades Height (alto) y Width (ancho) del botón. Para ello, cli-
queamos sobre “Automátic…” y seleccionamos la opción "Fill parent" (completar cua-
dro), dentro de las listas desplegables que nos aparecerá para ambas propiedades.
99
UTN – PROGRAMA DIGITAL JUNIOR
Dicho componente sirve para reproducir archivos de sonido. El nombre del archivo de
sonido a reproducir puede ser especificado tanto dentro del entorno de diseño como
dentro del editor de bloques.
En este caso, haremos clic en el botón Upload File del cuadro Media (2), dentro del
Designer. Dentro de la ventana que se nos presenta (3), ubicaremos al archivo de so-
nido que copiamos a la PC con anterioridad (Miau!.mp3); lo seleccionamos y lo subimos
al proyecto dando clic en “OK”.
Si seleccionamos ahora al componente Sound1, veremos que dentro del panel Propier-
ties, la propiedad Source (fuente) muestra la leyenda None (Ninguno). Haremos clic en
dicha leyenda para cambiar la fuente de sonido de Sound1 por Miau!.mp3 (4).
100
UTN – PROGRAMA DIGITAL JUNIOR
Podemos entender el conjunto de bloques obtenido como: "Cuando se haga clic sobre
Button1, se reproducirá el sonido de Sound1".
Podríamos decir que los bloques de control de eventos nos indican la categoría de la
acción a realizar (por ejemplo, el presionar un botón), mientras que los bloques de co-
mando especifican el tipo de acción y sus detalles (por ejemplo, la reproducción de un
sonido específico).
101
UTN – PROGRAMA DIGITAL JUNIOR
imagen del gatito tal y como la armáramos dentro del entorno de diseño. Verán que al
tocar (o hacer click) sobre el gatito se escuchara un maullido.
Grabadora de Voz
Crearemos un nuevo proyecto dentro del cual vamos a colocar dichos componentes
multimedia, como parte de la Screen1. Estos, al igual que Sound, son componentes del
tipo no visible, por lo que aparecerán debajo de dicha pantalla.
Como podemos ver en la imagen anterior, entre los componentes no visibles se encuen-
tra además el componente TinyDB1 (pequeña base de datos), el cual encontraremos
como parte de los componentes del tipo Storage (Almacenamiento).
Este es un componente que sirve para almacenar los datos de una App antes de su cie-
rre. Las Apps que creamos dentro App Inventor se reinicializan cada vez que se las
ejecuta, o sea, comienzan siempre desde el punto inicial o, por así decir, desde cero.
Esto quiere decir que los nuevos valores asignados a las variables dentro de la App, se
perderán cuando el usuario la cierre, y no podrán ser recuperados la próxima vez que
la aplicación se ejecute.
102
UTN – PROGRAMA DIGITAL JUNIOR
tags (obleas). Debido a esto, al momento de almacenar un dato, será necesario especi-
ficar el tag bajo el cual debe ser guardado.
En nuestro caso, utilizaremos para la presente App el TinyDB1, de modo que podamos
guardar y recuperar las rutas a los archivos de voz que hayamos grabado en anterio-
res ejecuciones de la aplicación.
Colocamos ahora un Spinner, el cual encontraremos como parte de los componentes del
tipo User Interface. Dicho componente sirve para mostrar en pantalla (y dentro de
una ventana), una lista de elementos determinada de la cual el usuario podrá escoger
la opción deseada.
Dichos elementos pueden ser establecidos dentro del Designer o del Blocks Editor,
tanto mediante el uso de la propiedad ElementsFromString como de la propiedad Ele-
ments.
En nuestro caso, utilizaremos el Spinner1 para listar una serie de números que repre-
sentarán a los archivos de audio que vayamos grabando. En principio no tendremos nin-
guna lista disponible. La intención es que dicha lista se vaya armando durante la ejecu-
ción de la App, lo cual definiremos luego dentro del Blocks Editor.
Continuando con el diseño, necesitamos colocar ahora tres botones, los cuales cumpli-
rán la función de grabar, parar o reproducir un determinado archivo de sonido. Como
se puede ver en la siguiente imagen, hemos colocado los mismos alineados dentro de un
HorizontalArrangement.
103
UTN – PROGRAMA DIGITAL JUNIOR
Una vez que hayan guardado los archivos aquí incluidos, deberán subirlos al entorno de
diseño por medio del cuadro Media, o como lo hiciéramos para el ejemplo del proyecto
anterior, dentro de la columna Properties. Luego, y debajo de una Label que hemos
utilizado como “Titulo”, colocamos un componente de tipo Slider, al cual hemos renom-
brado como “Volumen”.
El componente Slider es similar a una barra de progreso, la cual cuenta con un cursor
deslizable conocido como “thumb”. El usuario podrá arrastrar dicho cursor, luego de lo
cual se ejecutará el evento PositionChanged, el que informará la nueva posición de di-
cho cursor.
Utilizaremos la posición informada por dicho evento para modificar la propiedad Volu-
me del componente Player. Dicha propiedad determina el nivel de sonido para la re-
producción, con un valor por default de ‘50’ y un máximo de ‘100’.
Por dicha razón, estableceremos para nuestro Slider las siguientes propiedades con
los siguientes valores: MaxValue=‘100’, MinValue=‘0’ y ThumbPosition=‘50’. De este
modo, el usuario podrá modificar todo el rango de valores de volumen por medio de
dicho cursor o thumb.
Programación
Comenzaremos por explicar cómo grabar y utilizar un nuevo archivo de audio. Para ello,
bastará con utilizar el bloque call_SoundRecorder1.Start. Colocaremos este dentro
del evento when_Grabar.Click, el que se disparará cuando el usuario presione el botón
“Grabar”.
104
UTN – PROGRAMA DIGITAL JUNIOR
Dicho evento nos devolverá, por medio de su argumento sound, una cadena de caracte-
res, la cual representa la ruta al archivo recientemente grabado dentro del dispositivo
Android.
En líneas generales, dicha ruta estará compuesta por los nombres de los directorios
que conforman el camino hasta nuestro archivo, y finalizará con el nombre del archivo
al que se hace referencia. Estos nombres estarán separados por el carácter "/", cono-
cido como carácter delimitador.
105
UTN – PROGRAMA DIGITAL JUNIOR
Posteriormente vamos a incluir los bloques que necesitamos para almacenar la ruta
mencionada dentro de la base de datos TinyDB1.
Este es un componente del tipo multimedia que nos permite reproducir distintos ar-
chivos de audio, así como también hacer funcionar el vibrador del dispositivo.
Para poder reproducir un archivo, deberá especificase la ruta del mismo por medio de
la propiedad Source (fuente), lo que se puede realizar tanto dentro del Designer, co-
mo dentro del Block Editor. Esto último es lo que se muestra dentro de la imagen an-
terior.
De este modo, cuando el usuario toque sobre el botón Play, la reproducción comenzará,
y continuará hasta alcanzar el final del archivo. Sin embargo, si deseamos detener
dicha reproducción manualmente, podemos utilizar el bloque call_Player1.Stop.
Bastará con colocar dicho bloque de comando dentro de un bloque de control de even-
tos. En nuestro caso, vamos a colocarlo dentro del bloque when_Stop.Click, a conti-
nuación de call_SoundRecorder1.Stop, lo que permitirá al usuario detener además la
reproducción que Player1 pueda estar llevando a cabo.
106
UTN – PROGRAMA DIGITAL JUNIOR
cualquiera de estos dos métodos “Stop” no produce ningún tipo de error, aun cuando
no haya nada en ejecución.
Otro elemento que debemos tener en cuenta para la reproducción es el Slider “Volu-
men”, el cual hemos colocado con la intensión de que el usuario sea capaz de modificar
el nivel de sonido.
Como explicamos más arriba, vamos a utilizar el TinyDB1 para guardar y recuperar las
rutas a los archivos de voz que el usuario vaya grabando, y para hacer referencia a
cada una de ellas, utilizaremos unos nombres conocidos como tags.
Los tags son similares a los nombres de las variables dentro de las App, en el sentido
de cada uno de estos sirven para identificar unívocamente a un dato determinado. La
diferencia sustancial se debe a que estos estarán almacenados en un espacio físico
distinto dentro del dispositivo, por lo que la manera de trabajar con ellos es algo dife-
rente.
Para poder almacenar un nuevo dato dentro de la TinyDB1, necesitamos utilizar el blo-
que call_TinyDB1.StoreValue (almacenar valor en TinyDB1). Dicho bloque requiere
que se le informe tanto el nuevo valor a guardar como el nombre bajo el cual debe ser
guardado, utilizando respectivamente para ello sus encastres valueToStore y tag.
107
UTN – PROGRAMA DIGITAL JUNIOR
Una vez que dispongamos de algún dato dentro de la TinyDB1, podremos recuperarlo
utilizando el bloque call_TinyDB1.GetValue, al cual nos devolverá el valor almacenado
para el tag que determinemos en el encastre que lleva dicho nombre.
Conviene comentar además que el bloque “_”, el cual vemos conectado al encastre va-
lueIfTagNotThere, viene asignado a call_TinyDB1.GetTags por defecto. Dicho en-
castre sirve para definir un texto que será devuelto sólo en el caso de que el tag re-
querido resulte erróneo.
Por esta razón, resulta deseable que al momento de utilizar dicho comando, contemos
con el nombre de alguno de los tags existentes. Para ello vamos a utilizar el comando
call_TinyDB1.GetTags, el cual nos devolverá un listado con todos los tags que
TinyDB1 tiene disponibles. En el caso de que la TinyDB no cuente con ningún dato, el
valor devuelto será igual al de una lista vacía.
Para el caso de la presente App, vamos a utilizar una variable con la que podamos con-
tener la información devuelta por dicho comando. Inicializaremos para ello una varia-
ble del tipo list a la que llamaremos ListaTags.
La ventaja que nos da el tener el listado de los tag disponible en una variable del tipo
list, es que esta nos permitirá el uso de todos los operadores que App Inventor tiene
disponible para este tipo de variables, facilitando así la programación.
108
UTN – PROGRAMA DIGITAL JUNIOR
Por esta razón, necesitaremos que al iniciar la App, la variable ListaTags recupere el
listado de las tags mencionados, asignando dicho bloque de comando al setter
set_global_ListaTags. Colocaremos para ello a dicho conjunto de bloques dentro del
evento when_Screen1.Initialize, el cual sirve para ejecutar una secuencia de bloques
al ingresar a Screen1, o lo que es lo mismo para este caso, al iniciar la App.
Como se puede apreciar, hemos colocado dicho conjunto de bloques dentro del evento
when_Screen1.Initialize, a continuación del conjunto anterior.
Continuando con la programación, supongamos que disponemos ya de grabaciones de
voz, por lo que podremos reproducirlas utilizando nuestro componente Player1. Con
esto en mente, utilizaremos el evento when_Spinner1.AfterSelecting para definir una
nueva fuente del audio.
Dicho evento se ejecutará luego de que el usuario haya realizado una elección dentro
de la ventana que se presenta al tocar sobre Spinner1, e informará el valor de dicha
elección por medio del argumento “selection”.
109
UTN – PROGRAMA DIGITAL JUNIOR
Nótese aquí que el argumento selection coincidirá siempre con alguno de los tags del
listado informado anteriormente por call_TinyDB1.GetTags, logrando de este modo el
comportamiento buscado.
Como comentamos más arriba, deseamos que para la presente App cada tag sea nom-
brado de forma numérica, comenzando la cuenta a partir del número “uno”. Teniendo
en cuenta que dichos tags estarán disponibles dentro de la ListaTags, podremos de-
terminar cuál será el siguiente de ellos teniendo en cuenta el largo de la misma.
Luego, bastará con aumentar dicha cantidad en ‘1’ para obtener el valor de nuestro
nuevo tag.
Una vez hecho esto, vamos a almacenar la ruta informada por sound, utilizando para
ello el bloque call_TinyDB1.StoreValue. Asignaremos a dicho bloque los getters Nue-
voTag y sound en los encastres tag y valueToStore, respectivamente.
110
UTN – PROGRAMA DIGITAL JUNIOR
De este modo lograremos que la cadena de caracteres que representa la ruta del ar-
chivo recién grabado, sea “salvada” para su posterior lectura.
Nótese que en el caso de que esta sea la primera grabación realizada, no se dispondrá
de ningún tag, por lo que la ListaTags estará vacía y NuevoTag resultará igual a ‘1’,
indicando de este modo que es la primera ruta salvada. Luego, necesitaremos que el
NuevoTag sea agregado a la ListaTags.
111
UTN – PROGRAMA DIGITAL JUNIOR
112
UTN – PROGRAMA DIGITAL JUNIOR
En este módulo vamos a aprender sobre el uso de los componentes del tipo “Sensor”.
Aprenderemos también sobre uso del componente Notifier, uso de ImageSprites para
desplazar imágenes dentro de un Canvas, así como otros conceptos propios del editor
de bloques.
Vamos a construir una App que utilizará las características del componente Location-
Sensor. Este es un componente del tipo sensor, por lo que lo vamos a encontrar en me-
nú Sensors, dentro de la columna Palette.
113
UTN – PROGRAMA DIGITAL JUNIOR
También nos permitirá obtener la longitud y la latitud de una dirección dada, sin nece-
sidad de que esta coincida a la ubicación actual. Para poder utilizar el LocationSensor,
será necesario corroborar que su propiedad Enabled este definida como true, mien-
tras que el dispositivo Android deberá tener habilitado el uso de redes inalámbricas
y/o del GPS, al momento de utilizarla App.
En nuestro caso, utilizaremos para tal fin, un componente del tipo TextBox (casilla de
texto), el cual encontraremos dentro del menú User Interface.
Usaremos esta TextBox tanto para mostrar la dirección de la ubicación actual, como
para permitir el ingreso de una dirección deseada. Renombraremos la misma como
“CasillaDireccion”.
Más abajo colocamos unas Labels dentro de una serie de Arragements, todo esto des-
tinado a formar un cuadro que nos servirá para mostrar las coordenadas de la direc-
ción de “CasillaDireccion”.
114
UTN – PROGRAMA DIGITAL JUNIOR
Hemos agregado también un componente del tipo Notifier, el cual nos aparece debajo
de Viewer como un componente no visible de nombre Notifier1.
Programación
Una vez dentro del Blocks Editor, encontramos en la columna Blocks al menú Noti-
fier1, del cual seleccionaremos el bloque call_Notifier1.ShowMessageDialog. Este es
115
UTN – PROGRAMA DIGITAL JUNIOR
un bloque de comando que sirve para mostrar un mensaje en la pantalla, el cual se ce-
rrará cuando el usuario pulse un botón destinado para tal fin.
Dicho bloque cuenta con tres encastres de entrada, los cuales son: message, title y
buttonText. El primero de ellos recibirá el texto de mensaje a mostrar, el segundo
será el título del mensaje, mientras que el tercero sirve para establecer la leyenda del
botón que el usuario debe presionar para cerrar el mensaje.
En nuestro caso utilizaremos este bloque al inicio de la App, con la intensión de infor-
mar que: “Para poder utilizar esta aplicación, es necesario tener activados los
servicios de localización. Asegúrese de activarlos en Ajustes -> Ubicación y se-
guridad -> Mi Ubicación”.
Con esto en mente, colocaremos nuestro bloque de comando dentro del evento
when_Screen1.initialize, asignándole el texto del mensaje por medio de un bloque del
tipo “_”.
Como podemos ver en la imagen de arriba, también colocamos sendos bloques del tipo
“_” con los textos “Sensor de Localización” y “OK”, asignados respectivamente a los
encastres title y buttonText.
En la imagen anterior podemos ver que el bloque de texto que asignamos al encastre
“message” aparece truncado. Esto es debido a que hemos colapsado el bloque para
disminuir su largo, al hacer clic derecho sobre este y seleccionar “Collapse Block”
dentro del menú desplegable que se nos presenta.
116
UTN – PROGRAMA DIGITAL JUNIOR
Para deshacer esta acción bastará con volver a hacer clic derecho y seleccionar “Ex-
pand Block” dentro del nuevo menú desplegable.
Luego, colocaremos dicho conjunto dentro del espacio de tareas del bloque
when_BotonDireccion.Click, de modo que nos quede como podemos ver a continuación.
117
UTN – PROGRAMA DIGITAL JUNIOR
Haremos algo similar con el BotonCoordenada pero a la inversa. Esto es, obtener las
coordenadas (latitud y longitud) a partir una dirección dada, la que podremos ingresar
dentro de la CasillaDireccion al tocar sobre ella.
Por úl-
timo, vamos a asignar los mencionados bloques de comando a los setters
set_DatoLatitud.Text_to y set_DatoLongitud.Text_to. Colocaremos la secuencia de
118
UTN – PROGRAMA DIGITAL JUNIOR
Nuevamente, para que todo esto suceda, el usuario deberá haber habilitado los servi-
cios de localización dentro del dispositivo Android. El programa completo nos queda de
la siguiente forma:
La siguiente App simulará el lanzamiento de dos dados, de modo que la misma podrá
ser utilizada para llevar a cabo algún tipo de juego de mesa.
Diseño y Configuración
A continuación les presentamos una imagen, en la que podrán apreciar el diseño y los
componentes que hemos utilizado para esta App, a la que hemos nombrado simplemen-
te como “Dados”.
119
UTN – PROGRAMA DIGITAL JUNIOR
En la imagen anterior podemos ver el diseño de esta App, en la que hemos colocado un
componente Canvas1. Dentro de este hemos colocado dos imageSprite, a los que re-
nombramos como Dado1 y Dado2. Todos estos componentes los podemos encontrar
dentro de “Drawing and Animation”.
Los imageSprites son un tipo especial de componente para imágenes, cuyo uso está
destinado a los Canvas, permitiendo el desplazamiento de dichas imágenes en el inte-
rior de dichos cuadros. Estos pueden responder a las acciones del usuario (tocar y
120
UTN – PROGRAMA DIGITAL JUNIOR
Por otro lado, un imageSprite cuya propiedad Rotate sea igual a true, podrá girar su
imagen según la dirección y los cambios de rumbo de esta. Cualquiera de todas estas
propiedades puede ser modificada, tanto dentro del Designer, como durante la ejecu-
ción del programa por medio del editor de bloques.
Continuando con el diseño, colocaremos ahora un componente sensor del tipo Accele-
rometerSensor (sensor de aceleración), el cual aparecerá debajo de la pantalla selec-
cionada, ya que es un Non-visible component.
Usaremos este componente con la intensión de “agitar” los dados dentro del Canvas1.
Podremos hacerlo gracias a que este componente es capaz de detectar si nuestro dis-
positivo Android está siendo sacudido, o se lo ha movido bruscamente en alguna direc-
ción, ya que como lo indica su nombre, mide la aceleración de dichos movimiento.
Por último, colocaremos un componente Player, el cual vamos a utilizar para reproducir
el sonido de unos dados siendo mezclados dentro de un cubilete. Necesitaremos ade-
más subir al proyecto los siguientes archivos multimedia:
121
UTN – PROGRAMA DIGITAL JUNIOR
Sonido de Dados.mp3
Los archivos de imagen “Cara‘N’.jpg” representan las diferentes caras de un dado,
según el número de ‘N’. Utilizaremos respectivamente los archivos “[Link]” y “Ca-
[Link]”, para establecer inicialmente el valor de las propiedades Dado1 y Dado2.
Como comentamos más arriba, los imageSprites serán capaces de moverse dentro del
Canvas. Para que esto suceda, necesitamos que la propiedad Speed (velocidad) de di-
chos imageSprites tenga un valor distinto de ‘0’, por lo que le hemos dado un valor de
‘25’.
Por otro lado, necesitamos que los dados se muevan sólo luego de que el dispositivo
Android haya sido agitado, por lo que vamos a destildar la propiedad Enabled de am-
bos imageSprites.
Programación
Antes de empezar con la programación, vamos a comentar un poco sobre los bloques
que vamos a utilizar. Uno de ellos es el evento when_AccelerometerSensor1.Shaking.
En el caso de los imageSprites, tendremos en cuenta varios bloques, entre ellos los
eventos when_Dado1.EdgeReached y when_Dado2.EdgeReached.
122
UTN – PROGRAMA DIGITAL JUNIOR
Podemos entender los mismos como: cuando el Dado‘N’ Alcance uno de los Bordes
Haremos…
En efecto, estos son bloques de control de eventos que se dispararán cuando sus res-
pectivos imageSprites alcanzan a alguno de los bordes del Canvas al que pertenecen.
Adicionalmente, el argumento “edge” nos informará a cuál de los cuatro bordes alcan-
zó el imageSprite en cuestión.
La función de estos es muy sencilla. Al ser llamados, harán que el imageSprite al cual
pertenecen “rebote” en la dirección contraria al borde informado en su encastre edge.
Por dicha razón, están especialmente pensados para su uso con los bloques del tipo
when_imageSprite.EdgeReached, los cuales cuentan con el argumento “edge”, que es
el que nos brinda la información específica sobre los bordes alcanzados.
Otro bloque útil para el uso de los imageSprites es el bloque de control de eventos
when_Dado1.CollidedWith, el cual se disparará cuando el imageSprite el que pertene-
ce (en este caso, Dado1), “colisione” con otro imageSprite.
Vemos que dicho evento cuenta con el argumento “other”, el cual nos informa cuál de
los otros imageSprite fue el que disparo el evento.
Continuaremos ahora mencionando algunos de los bloques para propiedades que vamos
a necesitar para programar nuestra App. Tomemos por ejemplo a los setters
123
UTN – PROGRAMA DIGITAL JUNIOR
Estos son bloques del tipo Any component, lo que quiere decir que nos van a permitir
definir a que componente se los aplicará en el momento mismo de ser ejecutados. El
componente al cual se aplicarán deberá ser informado por medio de los encastres
“of_component”, incluido en cada uno de ellos.
124
UTN – PROGRAMA DIGITAL JUNIOR
Todo esto permite aplicar una misma secuencia de código a distintos componentes,
siempre y cuando estos sean del mismo tipo, como sucede en nuestra App con los ima-
geSprites “Dado1” y “Dado2”.
Este es un evento que se dispara cuando Player1 completa la reproducción del archivo
indicado por su propiedad Source. En nuestro caso, será muy útil para lograr que los
dados se detengan justo en el momento en que la reproducción del archivo “Sonido de
Dados.mp3” concluya, haciendo coincidir de esta forma el movimiento de los imageS-
prites “Dado1” y “Dado2”, con el sonido de la tirada.
Otros elementos que vamos a utilizar en la programación son los bloques de comando
call_Player1.Start y call_Player1.Vibrate.
Para el uso del comando call_Player1.Vibrate, será necesario establecer el tiempo (en
milisegundos) que se desea dure la vibración, asignando para ello un bloque numérico a
su encastre “milliseconds”.
Programación de la App
125
UTN – PROGRAMA DIGITAL JUNIOR
when_AccelerometerSensor1.Shaking (cuando_SensorAcelerómetro1_seaAgitado),
el que se encuentra en el menú de dicho componente.
Obteniendo un Resultado
Necesitaremos luego una secuencia de bloques que detenga el movimiento de los da-
dos, una vez que el “sonido de dados.mp3” deje de escucharse. Lograremos esto utili-
zando el bloque when_Player1.Completed. Dentro de él colocamos los bloques
set_Dado1.Enabled_to y set_Dado2.Enabled_to, a los cuales les hemos asignado en
este caso, un valor de verdad igual a false.
126
UTN – PROGRAMA DIGITAL JUNIOR
Si prueban la App hasta este punto, notaran que una vez que los dados llegan a un bo-
de, estos se quedaran “pegados” a él. Para evitar esto, necesitamos que los mismos
“reboten” cada vez que alcanzan cualquiera de los bordes.
Notarán ahora que si dejamos esto así, ambos dados rebotarán siempre perpendicu-
larmente contra los bordes derecho e izquierdo del Canvas1. Para modificar esto y
darle un aspecto más irregular (propio del mezclado), agregaremos dentro de los pre-
sentes eventos a los bloques set_Dado1.Heading y set_Dado2.Heading.
Como mencionamos antes, dichos setters nos permitirán modificar la propiedad Hea-
ding, cambiando así la orientación nuestros imageSprites, y con ella la dirección de sus
respectivos movimientos.
127
UTN – PROGRAMA DIGITAL JUNIOR
Por último, nos falta tener en cuenta que sucederá con los dados cuando estos se en-
cuentren. Para esto, haremos uso del bloque when_Dado1.CollidedWith:
Dentro del mismo hemos agregado una variable local con el fin de almacenar transito-
riamente el valor del “Angulo” de orientación del Dado1, el cual intercambiaremos lue-
go por el valor del ángulo de orientación del Dado2.
Para esto, utilizaremos los bloques set_imageSprite.Heading e [Link],
los cuales se encuentran en el submenú Any ImageSprite, dentro del menú Any com-
ponent.
Ya que en la presente App sólo tenemos dos imageSprites, parece innecesario utilizar
este tipo de bloques. Sin embargo, deseábamos incluirlos en ella con el fin de dar a
conocer su funcionalidad de la manera más sencilla posible.
Este tipo de bloques nos resultarán muy útiles cuando deseemos referirnos a más de
un componente de un mismo tipo, dentro de una misma secuencia de bloques, dando
como resultado un programa con menor cantidad de bloques.
128
UTN – PROGRAMA DIGITAL JUNIOR
Vamos a hacer una clásica calculadora, la cual luego podremos modificar para agregar
otras funciones. Crearemos para esto, un nuevo proyecto al que llamaremos Calcula-
dora.
Diseño y Configuración
Ya dentro del entorno de diseño, cambiaremos el título de la pantalla para que lleve el
mismo nombre del proyecto. Luego, colocaremos un HorizontalArrangement al que
vamos a renombrar como “Marco”, ya que servirá como tal para nuestro display. Den-
tro de este colocaremos un componente Label, al que renombraremos como “Display”.
Uso de TableArrangements
Debajo del Arrangement que colocamos recién, colocaremos otro pero en este caso
del tipo TableArrangement, el cual se encuentra en el mismo submenú. Renombrare-
mos a este como “Teclado”.
En nuestro caso, vamos a utilizar este TableArrangement para colocar una serie de
botones que formarán el teclado de la calculadora. Con esto en mente, vamos a modifi-
car el valor de las propiedades Columns (columnas) y Rows (filas), ambas en un valor
igual a ‘4’, obteniendo así un total de 16 cuadros.
129
UTN – PROGRAMA DIGITAL JUNIOR
Ahora, dentro de cada uno de los cuadro de esta tabla vamos a colocar un componente
Button, de manera que vayamos dando forma al teclado de la calculadora.
En nuestro caso, hemos utilizado un valor de “65 pixels”, tanto para la altura como
para el ancho de los botones, mientras que para el alto y ancho del “Display”, hemos
utilizado un valor de “40 pixels” y “272 pixels”, respectivamente.
Por otro lado, las propiedades de tamaño correspondientes a los Arrangements hasta
aquí utilizados, las hemos dejado como Automatic, de manera que los mismos se adap-
tarán a las medidas de los compontes colocados en su interior.
Por último y debajo de todo esto, colocamos un botón para “limpiar” al que renombra-
mos como BotonBorrar. Cambiaremos su leyenda por AC, de manera que resulte similar
al botón que encontraríamos en una calculadora comercial.
130
UTN – PROGRAMA DIGITAL JUNIOR
Ya que vamos a realizar una calculadora, tenemos que tener en cuenta varias cuestio-
nes, como por ejemplo que para resolver cualquier operación aritmética simple, será
necesario el ingreso de las cifras y el operador antes de poder obtener una respuesta.
Esto quiere decir que la programación que necesitamos realizar será de naturaleza
secuencial, siguiendo un orden determinado, por lo que el comportamiento de la App no
va a depender sólo de que tecla presionemos, sino también de cuándo ha sido presio-
nada esta.
Dicha máquina de estados se define por el conjunto de los estados que el programa
puede tomar. Dicho conjunto sirven para indicar cuál deberá ser el comportamiento de
la App según el estado en el que se encuentra.
Si bien este concepto no forma parte de App Inventor como tal, creemos que resulta-
rá muy conveniente el tener un conocimiento básico del mismo, el cual nos permitirá
llevar a cabo programas que implican cierto grado de complejidad.
En nuestro caso, vamos a definir los estados que necesitamos tener en cuenta para
que la presente App tenga un comportamiento similar al de una calculadora estándar,
como la que cualquiera de nosotros puede tener en su hogar o en su computadora.
Con esto en mente, hemos definido los siguientes estados, asignándole a cada uno un
número, el cual nos permitirá identificarlos. Dichos estados son:
131
UTN – PROGRAMA DIGITAL JUNIOR
Concepto de Procedimiento
Como sucede muchas veces en programación, en la presente App vamos a contar con
tareas o secuencias de bloques las cuales necesitamos repetir, ya que se requiere
realizarlas en más de un estado o punto del programa. Esto sucede por ejemplo con la
secuencia de cálculo, cualquiera sea el operador implicado.
Para poder hacer esto sin tener que programar dichas secuencias más de una vez, va-
mos a utilizar lo que en App Inventor se conocen como Procedures o Procedimientos.
Esto permite que en lugar de tener que colocar la misma secuencia de bloques una y
otra vez, podamos crear un procedimiento, el cual contenga todos los bloques tan sólo
una vez, para luego llamar a dicha secuencia por medio de su nombre, todas y cada una
de las veces donde necesitemos que la misma sea ejecutada.
Existen dos tipos de procedimientos dentro de App Inventor: los del tipo do y los del
tipo result.
132
UTN – PROGRAMA DIGITAL JUNIOR
Los procedimientos del tipo do sirven para agrupar secuencias de bloques, colocando
estas dentro de sus espacios de tareas.
Luego, podremos ejecutar dicha secuencia de bloques todas las veces que sea necesa-
rio, utilizando para ello un llamando a dicho procedimiento, de manera similar a como lo
hiciéramos con los bloques de comando.
Por otro lado, al crear un nuevo procedimiento, App Inventor definirá el nombre del
mismo de forma automática. Podremos modificar este nombre haciendo clic dentro del
cuadro que lo contiene.
El nombre de cada procedimiento dentro de una misma Screen será único, por lo que
no será posible definir dos procedimientos con el mismo nombre.
A su vez, habrán podido notar que este tipo de bloques de procedimiento pertenecen a
la categoría mutators, ya que cuentan con un cuadrito azul en su esquina superior iz-
quierda.
133
UTN – PROGRAMA DIGITAL JUNIOR
Como podemos apreciar en la imagen anterior, al cliquear en dicho cuadro azul se nos
despliega una ventana en forma de globo, dentro de la cual podremos utilizar los pseu-
do-bloques input para definir nuestros propios argumentos. Luego, podremos utilizar
dichos argumentos como lo hiciéramos en los bloques de control de eventos.
A su vez, cuando definimos nuevos argumentos un procedimiento, veremos que los blo-
ques call asociados al mismo son automáticamente modificados, incluyendo en ellos
nuevos encastres de entrada con el nombre de dichos argumentos.
A dichos encastres les asignaremos los parámetros con los cuales se inicializaran los
argumentos al momento de que el procedimiento sea ejecutado. Por esta razón, las
palabras “parámetro” y “argumento”, muchas veces son utilizadas en programación co-
mo sinónimos.
Los bloques de procedimiento del tipo result se utilizan de manera similar a los del
tipo do, con la diferencia de que luego de ser ejecutados, nos devolverán un valor como
resultado. Dicho resultado tomará el valor de la secuencia de bloques que haya sido
asignada a su encastre “result”.
Una vez definida, podremos ejecutar dicha secuencia de bloques todas las veces que
sea necesario, utilizando para ello su respectivo bloque call o de llamada al procedi-
miento.
134
UTN – PROGRAMA DIGITAL JUNIOR
Como sucede con los bloques de procedimiento del tipo do, el nombre de cada proce-
dimiento es único, y lo podremos modificar en cualquier momento. Al hacerlo, también
cambiarán los nombres de los bloques asociados.
A su vez, también este tipo de bloques pertenece a la categoría mutator, de modo que
podremos agregarles argumentos, de manera similar a los del tipo do.
Luego, podremos utilizar estos como lo hiciéramos en los bloques de control de even-
tos.
A su vez, al definir estos argumentos, los bloques call asociados serán modificados
para incluir en ellos los encastres de entrada a los parámetros, con los cuales se ini-
cializaran los argumentos.
135
UTN – PROGRAMA DIGITAL JUNIOR
Programación de la App
Vamos a comenzar creando las variables globales que necesitamos. Estas serán Esta-
do, Nro1, Nro2, Op y Acumulador. Como puede verse a continuación, inicializaremos
las mismas con un valor igual a ‘0’, a excepción de Op, a la cual le hemos asignado el
carácter “=”, a modo de operador neutro.
Estados, como su nombre lo indica, será la variable que por medio de su valor indicará
en cuál de los estados se encuentra el programa. Nro1 y Nro2 guardaran respectiva-
mente al primer y al segundo operando, hasta el momento en que se realice la opera-
ción. Op indicará la operación a realizar, mientas que Acumulador guardará el resulta-
do.
Para el caso de la presente App, vamos a utilizar tres procedimientos del tipo do. Co-
menzaremos por definir el primero, al que renombraremos como “Calculo”:
Como su nombre lo indica, este será el procedimiento dentro del cual se llevaran a ca-
bo los cálculos de las operaciones deseadas.
136
UTN – PROGRAMA DIGITAL JUNIOR
Vamos a analizar ahora cual será el modo en que utilizaremos los llamados a los proce-
dimientos. Comenzaremos por ejemplificar esto para el procedimiento Número. Una
vez que comprendamos como y donde realizaremos los llamados a este, pasaremos a
explicar cuál será la secuencia de bloques a ejecutar.
Como asignación para la entrada “valor” hemos colocado el bloque [Link], que
devuelve el texto que se lee dentro del dicho botón, o sea, el carácter ‘1’. Repetiremos
esto para los restante números del 2 al 9 (el cero y el punto serán casos particulares).
137
UTN – PROGRAMA DIGITAL JUNIOR
Veremos que nos aparecerá un nuevo conjunto de bloques idéntico al anterior. En am-
bos conjuntos de bloques nos aparecerá un símbolo de error. Al cliquear sobre este, se
nos informará que tenemos más de uno de estos bloques controladores de evento, para
el mismo componente.
138
UTN – PROGRAMA DIGITAL JUNIOR
Como mencionamos antes, haremos esto mismo para los restantes botones numéricos,
excluyendo el 0. Al hacer esto, logramos que un mismo conjunto de bloques (los del
procedimiento “Numero”), sea ejecutado en distintos momentos, para distintos even-
tos, y con un valor distinto en cada oportunidad, lo que simplificará por mucho nuestra
programación.
Si dicha condición se cumple, significa que nos encontramos en el estado inicial, por lo
que comenzaremos a ingresar el primer operando. Dicho operando lo formaremos colo-
cando las cifras ingresadas una a una dentro de nuestro Display.
Para este primer estado, vamos a asignar la cifra indicada por valor directamente al
bloque set_Display.Text, ya que nuestro Display se encontrará inicialmente en cero.
Además de hacer esto, será necesario establecer la variable Estado en ‘1’, ya que es el
estado que definimos para el ingreso del primer operando. De esta forma, la próxima
vez que se llame al procedimiento Numero, sabremos que el argumento valor contienen
una nueva cifra.
Vamos a cambiar además, la leyenda del BotonBorrar a “C” (Clear), lo que le indicará al
usuario que de presionar dicho botón, sólo se borrara lo último ingresado (programa-
remos esto más adelante, dentro del evento when_BotonBorrar.Click)
139
UTN – PROGRAMA DIGITAL JUNIOR
Procedemos ahora a ampliar nuestro if_then para que admita una segunda condición, la
cual se comprobará sólo en el caso de que no se cumpla la primera (Estado=0). Para
esto, cliquearemos dentro del pequeño cuadrado azul que se encuentra en su esquina
superior izquierda, para luego agregarle una entrada del tipo else_if, de la siguiente
forma:
Veremos que nos aparecerá tanto un nuevo encastre if (marcado como else_if), como
un nuevo espacio de tareas then, debajo del anteriormente utilizado. Una vez agrega-
do el nuevo encaste else_if, colocaremos como condición del mismo la comparación
entre la variable Estado y el número ‘1’.
140
UTN – PROGRAMA DIGITAL JUNIOR
Como hemos mencionado, esta nueva condición se evaluará si y sólo si la primera con-
dición resulta falsa, la cual se volverá a evaluar recién cuando el procedimiento Nume-
ro vuelva a ser llamado, y no inmediatamente después del cambio del valor de la varia-
ble Estado. Por ello decimos que nuestro if nos permitirá realizar una selección múlti-
ple; en este caso, elegir que acción realizar según el estado del programa.
Supongamos ahora que el procedimiento Numero vuelve a ser ejecutado, y que la va-
riable Estado es igual a ‘1’, de modo que el primer espacio then resulta ignorado. En
este caso, la segunda condición del if resultará verdadera, lo que implicará que una
nueva cifra ha sido ingresada, por lo que necesitamos unirla a las anteriores para ir
formando nuestro primer operando.
Así pues, colocaremos dentro de nuestro nuevo espacio then, un nuevo bloque
set_Display.Text, al que le vamos a asignar la unión entre su texto actual y la nueva
cifra. Para esto usaremos el bloque join (unir), el cual encontraremos dentro del sub-
menú Text.
En este punto valdría preguntarse ¿En qué momento ha sucedido esto? ¿Cómo puede
cumplirse que nos encontremos en el Estado 2, y que tanto el operador como el primer
operando hayan sido ingresados, siendo que todavía no hemos programado tales accio-
nes?
141
UTN – PROGRAMA DIGITAL JUNIOR
Haremos esto debido a que programar muchas veces requiere que nos adelantemos a
pasos posteriores. Aquí estamos suponiendo el caso de que se cumpla una condición que
va a ser establecida en otra parte del código, pero que de todas formas afectará al
comportamiento del actual procedimiento.
Para el caso del Estado 3, tenemos que realizar una tarea similar a la del Estado 1,
agregando el valor ingresado al Display, por lo que nuestro if quedará así:
142
UTN – PROGRAMA DIGITAL JUNIOR
Para el caso del Estado 6, supondremos que se ha presionado el BotonBorrar una sola
vez, por lo que si bien el segundo operando habrá sido borrado, contaremos todavía
con el primer operando y con el operador.
Adicionalmente, la leyenda de dicho botón será igual a “CE”, por lo que las acciones a
realizar aquí serán:
Para el caso del Estado 7, que es el estado de error de división por cero, sobre escri-
biremos la leyenda del Display (que será igual error) y pasaremos al Estado 1. Hare-
mos esto para que el comportamiento de nuestra App sea similar al de cualquier calcu-
ladora.
143
UTN – PROGRAMA DIGITAL JUNIOR
Pueden apreciar lo descripto para estos dos últimos casos en la imagen a continuación:
144
UTN – PROGRAMA DIGITAL JUNIOR
Vamos a programar ahora lo que sucederá cuando se presione alguna de las teclas para
los operadores. Utilizaremos para ello el procedimiento Operación, de manera similar
a como lo hiciéramos con las teclas numéricas, asociando en este caso los operadores
al argumento operador.
Para ello, vamos a colocar dentro de la ventana Viewer, los 4 controladores de evento
del tipo when_Boton….click correspondientes a cada operación. Luego, colocaremos
dentro de ellos la llamada al procedimiento Operación, asignándole a cada uno el texto
correspondiente a cada botón como parámetro del encastre operador:
145
UTN – PROGRAMA DIGITAL JUNIOR
A diferencia del caso anterior, no será necesario cambiar le leyenda del BotonBorrar,
debido que esto habrá sucedido ya dentro del procedimiento Numero, justo antes de
que Estado haya pasado a valer ‘1’:
146
UTN – PROGRAMA DIGITAL JUNIOR
Para el caso del Estado 2, sólo tendremos que asignarle el valor de la variable opera-
dor a la variable Op, ya que el único modo de que Estado sea igual a ‘2’ es debido a una
anterior ejecución del procedimiento Operacion, lo que indica que usuario ya ha ingre-
sado un operador, pero desea cambiarlo:
Como podemos apreciar, no hemos modificado aquí el valor de la variable Estado, per-
mitiendo de este modo que el usuario pueda cambiar de operador todas las veces que
necesite, ya que la secuencia a ejecutar será siempre la misma.
147
UTN – PROGRAMA DIGITAL JUNIOR
148
UTN – PROGRAMA DIGITAL JUNIOR
149
UTN – PROGRAMA DIGITAL JUNIOR
150
UTN – PROGRAMA DIGITAL JUNIOR
Vamos a definir ahora la secuencia de bloques que vamos a utilizar dentro del proce-
dimiento “Calculo”. Nuevamente, vamos a utilizar aquí un bloque if_then, con el cual
determinaremos cuál de las 4 operaciones aritméticas es la que se necesita realizar.
Como primera condición de este if, colocamos una comparación lógica entre la variable
global Op y el carácter “+”. De resultar verdadera, la operación a realizar será la
“suma”, por lo que dentro de su espacio de tareas, vamos a colocar un bloque
set_global_Acumulador_to, al que le vamos a asignar el bloque matemático “suma”
(submenú Math), el cual completaremos con las variable Nro1 y Nro2.
Luego, modificaremos el bloque if_then para que admita una segunda condición. Com-
pletamos esta nueva condición y su espacio de tareas de manera similar al anterior,
pero esta vez para el carácter “-” y el bloque matemático “resta”, con lo que nos que-
dará de la siguiente forma:
151
UTN – PROGRAMA DIGITAL JUNIOR
Ahora haremos todo esto mismo nuevamente, para el carácter “X” y el bloque mate-
mático “multiplicación”, quedándonos de la siguiente forma:
Tengamos nuevamente presente aquí, que el término else quiere decir “sino…” o “en
caso de que no se cumpla…”, por lo que cada encastre else_if se evaluará sólo en el
caso de que las condiciones en los encastres anteriores no hayan resultado verdade-
ras, por lo que si se cumple por ejemplo la igualdad de Op con “+”, no se evaluará nin-
guna de las posteriores condiciones (“-” y “X”).
Ahora bien; para el caso de la división, será necesario evaluar previamente si el segun-
do de los operandos resulta o no igual a ‘0’, ya que de ser así se establecerá la condi-
ción de error, cambiando además el valor de la variable Estado a ‘7’, que es el estado
que representa este error. Todo esto lo haremos con un nuevo if_then_else, cuya
condición será una comparación del tipo matemática entre Nro2 y ‘0’.
En caso contrario, podremos llevar a cabo la división, por cual colocamos dicha opera-
ción dentro del espacio de tareas else restante, asignando su resultado a la variable
152
UTN – PROGRAMA DIGITAL JUNIOR
La programación para este botón es bastante simple. Bastará con asignar los valores
correspondientes a las variables Nro1 y Nro2 según el estado actual, para luego y en
los casos que corresponda, realizar la operación deseada, por medio de la llamada al
procedimiento Calculo. Aquí está el algoritmo:
Tanto para el Estado 0, como para el Estado 1, sucede lo mismo, o sea, no contamos
con ningún operando, por lo que permaneceremos en el Estado 0:
153
UTN – PROGRAMA DIGITAL JUNIOR
Para el caso del Estado 2, sucederá que ya se habrán ingresado tanto el primer ope-
rando como el operador, por lo que tendremos que:
154
UTN – PROGRAMA DIGITAL JUNIOR
Si ahora, nos encontramos en el Estado 4, quiere decir que se acaba de completar una
operación, por lo que tendremos que:
Para el Estado 5, en el cual se estará ingresando un nuevo operando, luego haber ob-
tenido un resultado, tendremos que:
155
UTN – PROGRAMA DIGITAL JUNIOR
Por último, para el Estado 7, que es el estado de error, sólo tendremos que:
156
UTN – PROGRAMA DIGITAL JUNIOR
157
UTN – PROGRAMA DIGITAL JUNIOR
La función de este botón será la volver atrás la última operación o la de limpiar todo,
dependiendo del estado en que se encuentre el programa cuando este es presionado.
Por esta razón, para los estados que van del 2 al 5, se procederá a borrar sólo lo últi-
mo ingresado, estableciendo la leyenda del mismo como “CE” (Clear to Empty; Borrar
hasta vaciar), y pasando al Estado 6, que es el estado previo al borrado total. Para los
Estados 0, 1, 6 y 7, se restablecerán los valores de todas las variables, retornando al
estado de inicio (Estado 0):
158
UTN – PROGRAMA DIGITAL JUNIOR
Casos particulares
En el caso del botón ‘0’, vamos a utilizar prácticamente el mismo algoritmo que utiliza-
mos para el procedimiento Numero, con le salvedad de que sólo tendremos que modifi-
car la etiqueta Display cuando esta sea distinta de ‘0’ (no tiene sentido agregar ceros
a la derecha de otro cero).
Por esta razón, dentro de los Estados 3 y 5, necesitaremos agregar unos bloques
if_then, en los cuales utilizaremos como condición el bloque lógico “desigual”, el cual
se obtiene a partir de un bloque lógico “igual”, cliqueando sobre el cuadrito “=”, el cual
nos desplegará un pequeño menú, como podemos ver en la imagen a continuación:
Seleccionamos la segunda opción y acomodamos los bloques de manera que nos quedará
algo como esto:
159
UTN – PROGRAMA DIGITAL JUNIOR
De manera similar al caso del botón cero, utilizaremos para el BotónPunto un algoritmo
parecido al del procedimiento Numero, pero con ciertas modificaciones para los Esta-
dos 1, 3 y 5.
La idea es utilizar el punto como separador decimal, por lo cual si el usuario presiona
sobre dicho botón, será necesario que agreguemos un “.” (punto) a continuación de las
cifras ya ingresadas dentro del “Display”, siempre y cuando este no haya sido ingresa-
do con anterioridad.
En caso de que el texto asignado al encastre piece, este contenido dentro de la cade-
na asignada a text, el bloque conteins nos devolverá un valor de verdad igual a true.
160
UTN – PROGRAMA DIGITAL JUNIOR
Ahora, lo que necesitaremos será “preguntar por negativo”, anteponiendo para ello el
bloque lógico not, para luego utilizarlo como parte de la condición de un nuevo bloque if
de la siguiente forma:
Como dice el cuadro de ayuda desplegado sobre el cursor en la imagen, el bloque not
“devuelve un valor verdadero si a la entrada del mismo se ingresa un valor falso, y
devuelve un valor falso si a la entrada del mismo se ingresa un valor verdadero”.
Con esto se logra hacer que “si el texto del Display no contiene “.” (un punto), en-
tonces este sea agregado al final”.
161
UTN – PROGRAMA DIGITAL JUNIOR
162