Gestión de gestos de navegación en Android 10

10 de marzo


Todos los sistemas operativos proponen diferentes formas de interactuar con los elementos en pantalla. Conocer la diferencia entre ellos y utilizar elementos familiares para el usuario asegura que este se sienta cómodo y seguro usando tu aplicación.

Pese a las diferencias existentes entre los distintos sistemas operativos, todos comparten algunos puntos de vista fundamentales que se manifiestan en el diseño de sus interfaces. Estos son:

  • Simplicidad: relacionada directamente con la usabilidad. La interfaz debe tener una función bien definida que contribuya a cumplir el objetivo de la app y ayude al usuario.
  • Consistencia: debe respetar los conocimientos y las costumbres del usuario, no sólo dentro de la aplicación, sino también en relación con todo el Sistema Operativo. La relación existente entre apariencia y comportamiento también tiene que ser consistente.
  • Navegación intuitiva: utilizar los diferentes elementos que ya provee el sistema operativo para navegar por él ayudará al usuario a la hora de interactuar con la aplicación.

 Los usuarios están acostumbrados en comunicarse con su dispositivo y las apps instaladas en este con una serie de gestos de pantalla que ya tienen interiorizados. A veces, las actualizaciones de los sistemas, como es el caso de Android 10, hacen que estos gestos entren en conflicto con los de las apps por lo que hay que tenerlo en cuenta en la fase de desarrollo.Android Q o Android 10 ha agregado un nuevo modo de navegación en el sistema que permite al usuario navegar hacia atrás (deslizar borde izquierdo/derecho), a la pantalla de inicio (deslizar hacia arriba desde la parte inferior) y activar el asistente deslizando el dedo desde las esquinas superiores. Al pasar a un modelo de gestos para la navegación en el sistema, se puede proporcionar mayor pantalla a las aplicaciones, generando así experiencias más inmersivas. Estos cambios pueden confundir al usuario, más aún si entran en conflicto los gestos del Sistema Operativo con los de nuestra app.

 

Estos cambios pueden confundir al usuario, más aún si entran en conflicto los gestos del Sistema Operativo con los de nuestra app.

Vamos a verlo con una aplicación de música que permite mover el tiempo de la canción deslizando sobre una barra de desplazamiento o SeekBar y que se puede confundir con el gesto del Sistema Operativo de navegar hacia atrás. Esto sucede porque la zona de gestos inferior se superpone a la barra de búsqueda, por tanto, el gesto de inicio tiene prioridad al ser el del Sistema.

La solución más simple en este caso sería añadir un margen inferior para que la barra de búsqueda quede más arriba y no interaccione con la zona de gestos.




Para implementar esto, necesitamos usar las nuevas inserciones de gestos del sistema, disponibles a partir de API 29 y la biblioteca Jetpack Core v1.2.0. En el ejemplo, aumentamos el relleno inferior del SeekBar para que coincida con el valor de inserción del gesto inferior:


ViewCompat.setOnApplyWindowInsetsListener(seekBar) { view, insets -> 

    // We'll set the views bottom padding to be the same

    // value as the system gesture insets bottom value

    view.updatePadding(

        bottom = insets.systemGestureInsets.bottom

    )

    insets

}

 

Otra solución para un problema de este tipo es excluir los gestos del sistema para ciertas partes de la pantalla. Esto puede hacerse a través de las API de exclusión de gestos que están disponibles para Android 10.

Para excluir áreas podemos utilizar:

  • View.setSystemGestureExclusionRects()
  • Window.setSystemGestureExclusionRects()

 

Las APIS para excluir gestos se llaman generalmente desde dos lugares: onLayout() cuando la visualización está expuesta, y onDraw() cuando la visualización está diseñada. Tu visualización pasa a List, conteniendo todos los rectángulos que deberían ser excluidos. Como se menciona anteriormente, estos rectángulos deben estar en el sistema de coordinadas propio de cada visualización.Por lo general, se debe crear una función similar a esta, que se llamaría desde onLayout() y/o onDraw():

 

 

private val gestureExclusionRects = mutableListOf()

 

private fun updateGestureExclusion() {

    // Skip this call if we're not running on Android 10+

    if (Build.VERSION.SDK_INT < 29) return

 

    // First, lets clear out any existing rectangles

    gestureExclusionRects.clear()

 

    // Now lets work out which areas should be excluded. For a SeekBar this will

    // be the bounds of the thumb drawable.

    thumb?.also { t ->

        gestureExclusionRects += t.copyBounds()

    }

 

    // If we had other elements in this view near the edges, we could exclude them

    // here too, by adding their bounds to the list

 

    // Finally pass our updated list of rectangles to the system

    systemGestureExclusionRects = gestureExclusionRects

}

 

Dado que el comportamiento que habilita esta API es dañina para el usuario, el sistema limita su uso: las aplicaciones solo pueden excluir hasta 200 dppor borde para permitir que los usuarios puedan seguir utilizando el desplazamiento de borde que ofrece el Sistema Operativo.

 

 

 

Samsung Dev Spain es la comunidad oficial de Samsung para desarrolladores españoles. Si te das de alta, puedes conseguir entrar en nuestro programa de préstamos -y conseguir dispositivos para desarrollar apps para nuestro ecosistema-, acceder a material gratuito como la primera guía académica de VR, participar en promociones como dispositivos por apps o acudir gratis a eventos formativos como Samsung Dev Day. Si aún no lo has hecho, puedes darte de alta en este formulario de registro.