Introducción a ofxMobileKeyboard
Hace unos meses, desarrollamos una aplicación móbil multiplataforma (Android y iOS) que requería de la introducción de textos por parte del usuario. Por el contenido multimedia y por su componente multiplataforma, desarrollamos la app en Openframeworks.
Trabajar con elementos nativos como el teclado del sistema operativo, nos obligaba a hacer variaciones en el código de ambas versiones de la app. Buscando trabajar en la línea de “one code to rule them all” que tanto nos gusta de OF, pensamos que sería útil encapsular esta parte discordante del código en un addon. Este addon lo hemos llamado ofxMobileKeyboard y lo podéis encontrar en github y en el repositorio de addons de la web de OF, ofxaddons.com.
Juntamente con el addon, hemos añadido dos ejemplos simples con la implementación de las funciones básicas del addon. A continuación, las comentamos.
El add-on es compatible tanto con la versión Android como iOS de Openframeworks. Una vez instalado e incorporado a nuestro proyecto podremos inicializar y llamar fácilmente al teclado nativo en ambas plataformas. Empezamos por declarar un objeto ofxMobileKeyboard en el .h:
ofxMobileKeyboard keyboard;
Para hacerlo en iOS, en el método setup() del .mm, escribimos:
keyboard.setup("Type text here", 0, 200, ofGetWidth(), 50); keyboard.showKeyboard();
En Android, esta llamada es ligeramente distinta ya que por las características del JNI -leer más sobre JNI y openframeworks- deberemos pasar por parámetro el nombre de nuestro proyecto. Por lo tanto, en el setup() del .cpp lo haremos mediante el siguiente método:
keyboard.setup("ofxMobileKeyboardExampleAndroid", (ofGetWidth()/2)-(textBoxWidth/2), (ofGetHeight()/2)-(textBoxHeight/2), textBoxWidth, textBoxHeight, "Type text here"); keyboard.showKeyboard();
A partir de aquí, el addon ofrece funcionalidades bastante sencillas con los métodos showKeyboard(), hideKeyboard(), recieveKeyboard () -que nos devolverá un string con el contenido introducido- y isKeyboardActive() -que nos devolverá un bool afirmativo o negativo en función de si el teclado está activo-.
Siguiendo con el ejemplo de github, podemos mostrar o esconder el teclado con las siguientes líneas escritas en el método touchDoubleTap().
if(keyboard.isKeyboardActive()==true){ keyboard.hideKeyboard(); }else if(keyboard.isKeyboardActive()==false){ keyboard.showKeyboard(); }
Para obtener el contenido escrito mediante el teclado, igualamos un string -keyboardText- al método recieveKeyboard() del objeto.
if(keyboard.isKeyboardActive()==true){ keyboardText = keyboard.recieveKeyboard(); ofLog() << "Recieve Keyboard String: "<< keyboardText << endl; }
Recapitulando, el objetivo del addon es mantener la línea de trabajo de OF que permite usar un mismo código para plataformas distintas. Como habréis visto, en este sentido solamente hemos encapsulado unas funcionalidades sencillas que, al presentarse a modo de addon, pasan a ser mucho más usables.
Aprovechamos el post para recomendar la visita al libro que está preparando la comunidad OF y que tiene muy buena pinta.
Happy coding!
Muy bueno el aporte me gustaría comentar varias cosas.
1.- El enlace a “Openframeworks” del primer párrafo no esta construido correctamente y enlaza mal.
2.- En el metodo “touchDoubleTap()” creo que seria mas conveniente escribirlo como:
if(keyboard.isKeyboardActive()==true){
keyboard.hideKeyboard();
}else {
keyboard.showKeyboard();
}
Esto dependiendo del caso nos ahorraria una comprobación, puesto que si primera condición es false llegaría al if else ejecutando otra condición innecesaria puesto que ya sabriamos el resultado devuelto por “isKeyboardActive()”.
Si entra en el primer if ha devuelto true y sino seguro que sera falso.
3.- No tengo muy por la mano esta maravilla que parece Openframeworks y sin conocimiento del mismo os quería hacer una pregunta.
¿Para compilar una app para iOs o Android se utilizan compiladores diferentes?
Mi pregunta viene por si puedes desarrollar una sola aplicación y hacer un compilar para una plataforma u otra.
Con los datos que tengo entiendo que si se usan diferentes compiladores puesto que la función setup se llama de forma distinta según el dispositivo. ¿O este paso se podría automatizar?
Después de la chapa solo deciros buen trabajo seguid así.