mattfbacon / messagease-better

A re-implementation of the Messagease keyboard layout
GNU Affero General Public License v3.0
11 stars 2 forks source link

Adding Haptic feedback and swipe #2

Open fpirez opened 1 year ago

fpirez commented 1 year ago

Hola Matt, escribo en español ya que tu perfil dice que lo hablas de manera fluida, pero si prefieres puedo escribir en inglés. Me sorprendió gratamente encontrar tu implementación Open Source de MessagEase, que es el teclado que uso desde hace ya unos años, y siempre he tenido el interés, pero no el tiempo, de probar hacerle algunas modificaciones que quizás podrían mejorarlo. Una de ellas es añadirle haptic feedback que ayude a saber si estamos presionando lo que queremos, lo cual podría ayudar a escribir sin mirar la pantalla. Por ejemplo, la tecla central (letra "o") podría vibrar de manera diferente al resto, y/o se podría generar una vibración al cruzar el límite entre dos teclas.

También quisiera probar cómo se adapta el teclado al uso del desplazamiento (swiping). Me parece bastante sencillo para el usuario pasar de escribir letra por letra a deslizar de manera continua, pero no sé si el resultado es aceptable en el sentido de poder determinar con precisión la palabra que se intenta escribir. En simulaciones "manuales" que hice parece viable. Este método sería útil para quienes escriben con un solo dedo, lo cual actualmente no es mi caso, pero sería interesante probarlo.

¿Qué te parece? ¿Ves muy complejo implementar alguna de estas variantes?

Saludos, Fabricio.

mattfbacon commented 1 year ago

Gracias por esto.

Implementar desplazamiento me parece complejo. Específicamente, considera si el usuario golpe (swipe) desde H a R. Es "hor", "kbr", "kor", etc? Si tienes ideas, por favor dímelas.

Por otro lado, haptic feedback me parece relativamente sencillo. En el manejador de tacto del usuario, onTouchEvent, puede detectar cuando el tacto pasa entre las teclas y vibrar. Yo nunca he pensado en esto simplemente porque no me gusta la vibración de móvil y he apagado toda. Pero si quieres, solo necesitas añadir un poco de código aquí:

https://github.com/mattfbacon/messagease-better/blob/659be34ccf9cfff69bc244962da35b888fbede62/app/src/main/java/nz/felle/messageasebetter/InputMethodView.java#L481-L486

que compara la posición previa y actual. Ya hay código para traducir posiciónes a teclas, aquí:

https://github.com/mattfbacon/messagease-better/blob/659be34ccf9cfff69bc244962da35b888fbede62/app/src/main/java/nz/felle/messageasebetter/InputMethodView.java#L437-L454

Pero sería bueno extraerlo a una función así que puedes reutilizarlo.

Avísame si necesitas ayuda.

fpirez commented 1 year ago

Gracias por los comentarios. Yo también tengo el feedback táctil apagado :) pero me pareció una buena idea probar eso, sobre todo porque puedo escribir un poco sin mirar, pero poco a poco voy perdiendo la referencia de la posición de los dedos. Alguna vez probé colocando un pequeño puntito en la pantalla, en el centro de la letra "o" (similar a como las teclas F y J tienen una marca en un teclado físico), y era de mucha ayuda!

En cuanto al desplazamiento, debería ayudarse de un diccionario, y calcular las palabras válidas (pudiendo por ejemplo dar opciones). Para el caso de ir de H a R, las letras posibles son: H, K, O, B, R Al presionar la H, tenemos como primer opción que la palabra puede empezar con esa letra. Al pasar a la O, se agrega la K (como primera o segunda letra). Esto podría representarse con la expresión regular "^(h|hk|k)". También, opcionalmente, se agrega la letra O, en segundo o tercer lugar: "^(h|hk|k)o?". Y así, hasta llegar a la expresión regular: "^(h|hk|k)o?(b|br|r)$". Lo razoné a medida que iba escribiendo y pensando en la solución, así que puede que no sea correcta la expresión regular, pero creo que va por ese camino.

mattfbacon commented 1 year ago

en el centro de la letra "o"

Pues funcionaría vibrar cuando el tacto entre en o sale de esa letra?

En cuanto al desplazamiento

Sí, probablemente funcionaría. Para ser honesto, no me gusta usar un diccionario, porque siempre hay palabras que no están en el diccionario y puede ser irritante. También requeriría diccionarios para cada idioma en que el usuario quiere escribir. (Y también una manera de elegir, añadir a, cambiar, etc los diccionarios)

Me parece posible detectar cuando el usuario mantiene una posición de tacto para un momento y escribir esa letra, así que no sería "swipe" de verdad pero permitiría al usuario mantener el dedo en la pantalla mientras escribe. Qué te parece?

fpirez commented 1 year ago

Es cierto, se requiere instalar un diccionario por cada idioma, y brindar la posibilidad de añadir palabras. Mi idea de usar deslizamiento es para poder mejorar la velocidad de escritura, pero quizás este mecanismo solo la empeore! La opción de escribir la letra al mantener presionada la pantalla me parece que también iría en contra de la velocidad de escritura. Otra opción que se me ocurre es poder configurar gestos para ingresar palabras o sílabas frecuentes, aunque quizás no vale la pena en cuanto a costo/beneficio.

mattfbacon commented 1 year ago

Me gusta la idea de gestos para palabras. Hay muchos gestos no usados, incluso toda la tecla superior derecha. Se podria usar para esto.

(Escribi esto en el teclado asi que no tengo acentos. Tal vez la tecla superior se podria usar para eso.. Este distintivo me importa mas.)

fpirez commented 1 year ago

Recién tuve oportunidad de probar tu teclado (instalé Android Studio y tuve que aprender sobre la marcha a generar la aplicación, ya que nunca había hecho nada para dispositivos móviles). Cumple con su función en cuanto a velocidad de respuesta, pero veo que me acostumbré mucho a funciones del teclado MessagEase original, que no están disponibles y me parecen realmente útiles, y creo que podría ser interesante agregar algunas a tu teclado. Listo algunas a modo de ejemplo:

Como ves, ahora son muchas más las ideas que tengo para mejorarlo :)

mattfbacon commented 1 year ago

Sí, me parecen útiles.

Multitouch - me parece sencillo. La lógica de traducir tactos a letras podría seguir igual. Creo que ya hay utilidades que permiten el seguimiento de múltiples tactos.

Otros gestos, y gestos más complejos - un poco más difícil. Ahora simplemente uso las posiciones al principio y al final, así que, por ejemplo, un gesto a la derecha y entonces al superior sería lo mismo que un gesto en diagonal.

Números por dejando presionada - he preferido que dejando presionada una tecla repite la letra. :shrug:

Eliminar palabras completas - Voy a hacer esto. He sido perezoso :sweat_smile: y la tecla para eso ahora borra diez letras.

Ocultar el teclado - Voy a hacer esto.

También poder ajustar el tamaño del teclado - Creo que puede ser ajustado por código en una variable pero no estoy seguro.

mattfbacon commented 1 year ago

He implementado esos distintivos. Creo que también debo añadir una manera de anotar acentos, pero tendré que pensar en cómo.