Gestión de gestos: manejo de superposiciones visuales. Parte 2

En previsión del inicio de un curso avanzado en desarrollo de Android, continuamos compartiendo con usted una serie de traducciones útiles.





Estás leyendo el segundo artículo de una serie sobre gestión de gestos. Puedes encontrar la primera parte aquí .

En la primera parte de la serie, aprendimos cómo posicionar su aplicación "de borde a borde" de la pantalla. Desafortunadamente, esta forma de visualización puede llevar al hecho de que algunas de sus vistas se ubicarán más allá de los bordes en el área de los paneles del sistema, ocultándolas así para el usuario. En este artículo, descubriremos cómo agregar una view de tal manera que no interrumpa el funcionamiento de los paneles del sistema.

En este artículo, me referiré a un "sistema de interfaz de usuario". Este es el nombre de cualquiera de las interfaces del sistema ubicadas en la pantalla, ya sea una barra de navegación o una barra de estado. También incluye una barra de notificaciones.

Inserciones


El término inserciones , por regla general, causa temor entre los desarrolladores de Android, ya que en algún momento de Android Lollipop siempre intentaron usar el área de trabajo de la barra de estado. Por ejemplo, esta vieja pregunta sobre StackOverflow tiene una gran cantidad de vistas.

Los recuadros muestran qué componentes de la pantalla se cruzan con la interfaz del sistema, por ejemplo, una barra de navegación o una barra de estado. La intersección puede significar simplemente mostrar encima de su contenido, pero aquí también puede obtener información sobre los gestos del sistema. Podemos usar el recuadro para tratar de resolver cualquier conflicto, por ejemplo, alejando la view de los bordes.

En Android, las inserciones están representadas por la clase WindowInsets , y en AndroidX por la clase WindowInsetsCompat . Comenzando con Android Q, tenemos 5 tipos de inserciones que podemos usar al crear pantallas de aplicaciones. El tipo de inset utilizar depende de la situación, así que veamos cada tipo por separado y veamos.

Ventana del sistema insertada


Método : getSystemWindowInsets ()

La inserción de la ventana del sistema es el tipo de inset más común en la actualidad. Existen con API 1 en varias formas y aparecen en la jerarquía de view cada vez que la interfaz de usuario del sistema se muestra en la parte superior de la aplicación (a lo largo del eje z). Ejemplos comunes son la barra de estado y la barra de navegación, y algunas veces el teclado en pantalla (IME).

Veamos un ejemplo en el que tiene que usar inserciones de ventanas del sistema . Ya tenemos un FloatingActionButton (FAB) , que se encuentra en la esquina inferior de la pantalla con una sangría de 16dp (de acuerdo con las pautas ).


FAB en una aplicación de E / S de Google antes de que se convierta de borde a borde

Después de seguir los pasos 1 y 2 del artículo anterior , nuestras view estarán detrás de la barra de navegación:


FAB en la aplicación Google I / O, después de estirar a pantalla completa

Ahora puede ver que su agenda de conferencias se encuentra detrás de la barra de navegación, y esto es exactamente lo que buscamos: crear una experiencia más inmersiva. En más detalle sobre cómo trabajar con listas / cuadrículas, consideraremos más adelante.

Volvamos al ejemplo. Ahora verá que el FAB está oculto, y esto a su vez significa que el usuario no podrá hacer clic en él. Es este conflicto de visualización lo que queremos evitar. El ejemplo se ve más claro cuando usamos el botón de navegación (como en la imagen), ya que el panel está ubicado más arriba. En la navegación por gestos con adaptación dinámica de color, esto funcionará, pero recuerde que el sistema puede cambiar a una malla translúcida en cualquier momento, lo que puede interrumpir la experiencia de interacción.
Ahora es un buen momento para decirle lo importante que es probar su aplicación en todos los modos de navegación.

Entonces, ¿cómo lidiamos con este conflicto visual? En este punto, las inserciones de las ventanas del sistema entran en juego. Le indicarán dónde se encuentran los paneles del sistema en su jerarquía de vistas , y puede usar estos valores para alejar la vista de los paneles del sistema.

En el ejemplo anterior, la FAB se encuentra cerca de la parte inferior derecha, por lo que podemos usar los valores de systemWindowInsets.bottom y systemWindowInsets.right para aumentar la sangría de la view en cada lado para alejarla de la barra de navegación.

Una vez que hacemos esto, obtenemos lo siguiente:


Hablaremos sobre cómo se implementa esto un poco más tarde.

TL DR: las inserciones de las ventanas del sistema son más adecuadas para mover / sangrar views interactivas que no deberían estar cubiertas por los paneles del sistema.

Inserciones de elementos que se pueden tocar


Método : getTappableElementInsets ()

Más abajo en la lista, tenemos inserciones de elementos que se pueden tocar que acaban de aparecer en Android Q. Son muy similares a las inserciones de la ventana del sistema anteriores, sin embargo, responden a la visibilidad variable de la barra de navegación.

TL; DR: en cuanto a las tappable element insets que se pueden tappable element insets : generalmente puede ignorarlas y utilizar en su system window insets . Puede saltar a la sección de Inserciones de gestos a continuación o continuar leyendo.

Las inserciones de elementos que se pueden tocar definen las inserciones mínimas que deben aplicarse en una vista interactiva (que se puede tocar). "Mínimo" en este caso significa que el valor aplicado aún puede generar un conflicto con los paneles del sistema. Esto es lo que los distingue de las inserciones de ventanas del sistema , que siempre tienen como objetivo evitar conflictos con los paneles del sistema.

Usemos nuestro ejemplo con un FloatingActionButton para mostrar la diferencia de valores:


Los bordes de la barra de navegación se muestran en rosa. Verde: FAB limita con una sangría específica desde el margen inferior.



Recuerde que nunca puede codificar valores de la tabla anterior, ya que la barra de navegación puede cambiar de tamaño. Use inserciones para evitar conflictos.

Es posible que hayamos notado que las tappable element insets que se pueden tappable element insets y las tappable element insets system gesture insets comportan de la misma manera cuando el dispositivo está en modo de navegación con botones. Una diferencia clave se hace visible cuando el dispositivo usa control de gestos y tiene activada la adaptación dinámica del color. En este caso, la barra de navegación es transparente, lo que significa que es teóricamente posible organizar views interactivas views , por lo que la sangría desde abajo es 0.

A pesar del hecho de que las insets no tienen idea de dónde deberían ubicarse las vistas, por lo tanto, usando inserciones de elementos que se pueden tocar en teoría, puede obtener algo similar:



No funcionó perfectamente, ya que la view está muy cerca de la barra de navegación, lo que no será muy conveniente para el usuario.

En la práctica, casi todos los casos de uso para inserciones de elementos que se pueden tocar se manejan mejor con inserciones de ventanas del sistema .

Inserciones gestuales


Métodos : getSystemGestureInsets () y getMandatorySystemGestureInsets ()

El siguiente tipo de insets que veremos son las gesture insets , agregadas en la versión de Android Q. Recuerdo que Android Q introduce un nuevo modo de control de gestos que permite al usuario controlar el dispositivo utilizando dos gestos táctiles, que se pueden realizar de la siguiente manera:

  1. Deslice horizontalmente desde uno de los bordes de la pantalla. Esto activará la acción de retorno.
  2. Deslice hacia arriba desde el borde inferior de la pantalla. Esto permitirá al usuario ir a su pantalla de inicio o a las últimas aplicaciones utilizadas.


Demostración de gestos en Android Q

Las inserciones de gestos del sistema reflejan áreas de la ventana donde los gestos del sistema tienen prioridad sobre los gestos táctiles en su aplicación. Es posible que haya notado que he indicado dos métodos anteriores. Esto se debe al hecho de que en realidad hay dos tipos de inserciones de gestos del sistema : una de ellas almacena todas las áreas de gestos y la segunda un subconjunto que contiene las inserciones de gestos del sistema obligatorias.

Inserciones gestuales del sistema


Para empezar, tenemos inserciones de gestos del sistema . Contienen todas las áreas de la pantalla donde los gestos del sistema tienen prioridad sobre los gestos de su aplicación. En Android Q, esto significa que las inserciones se verán así, es decir, contienen sangría desde el borde inferior para que un gesto regrese a la pantalla de inicio, sangría a la izquierda y derecha para un gesto hacia atrás:

  0 +--------------+ | | | System | 40 | Gesture | 40 | Insets | | | +--------------+ 60 

¿Cuándo serán útiles las inserciones de gestos del sistema ? Estas insets indican dónde tienen prioridad los gestos del sistema, por lo que puede usarlos para mover proactivamente cualquier vista que requiera un gesto de deslizar.

Los ejemplos incluyen una pantalla que se extiende desde abajo , desliza en juegos, carruseles (como ViewPager ). En general, puede usar estas insets para mover / sangrar desde los bordes de la pantalla.

Inserciones obligatorias de gestos del sistema


Las inserciones de gestos del sistema obligatorias son un subconjunto de inserciones de gestos del sistema y contienen solo áreas que no se pueden eliminar de la aplicación (por ejemplo, el nombre). Miramos un poco hacia adelante en el tema del próximo artículo, donde hablaremos sobre el manejo de conflictos de gestos, pero para entender el artículo actual, solo sepamos que las aplicaciones pueden eliminar los gestos del sistema de algunas áreas de la pantalla.

Las inserciones obligatorias de gestos del sistema indican áreas de la pantalla donde los gestos del sistema siempre tienen prioridad y son obligatorias. En Android Q, la única área obligatoria en este momento es el área de gestos de la pantalla de inicio en la parte inferior de la pantalla. Esto es necesario para que el usuario siempre pueda salir de la aplicación.
Si observa el ejemplo de inserciones gestuales en un dispositivo Android Q, verá lo siguiente:

  0 0 +--------------+ +--------------+ | | | Mandatory | | System | | System | 40 | Gesture | 40 0 | Gesture | 0 | Insets | | Insets | | | | | +--------------+ +--------------+ 60 60 

Se puede ver que las inserciones de gestos del sistema contienen sangrías a la izquierda, derecha e inferior, mientras que las necesarias contienen solo sangría desde la parte inferior para que el gesto de retorno a la pantalla de inicio funcione normalmente. Hablaremos más sobre la eliminación de áreas de gestos en el próximo artículo.

Insertos estables


Método : getStableInsets ()

Las inserciones estables son el último tipo de inserciones disponibles en Android. No son particularmente importantes para gestionar los gestos, pero decidí que valía la pena hablar de ellos.

Las inserciones estables se refieren a las inserciones de la ventana del sistema , pero indican dónde se puede mostrar la interfaz del sistema en la parte superior de su aplicación, y no dónde se muestra en principio. Las inserciones estables se usan principalmente cuando la interfaz del sistema está configurada de tal manera que su visibilidad se puede activar o desactivar, por ejemplo, cuando se utiliza la inclinación hacia atrás o los modos inmersivos (por ejemplo, juegos, visualización de fotos y reproductores de video).

Manejo de insertos


Espero que comprenda mejor cuáles son los distintos tipos de insertos , así que ahora veamos cómo puede usarlos en sus aplicaciones.

El método principal para acceder a WindowInsets es el método setOnApplyWindowInsetsListener . Veamos una view ejemplo, a la que queremos sangrar para que no aparezca detrás de la barra de navegación:

 ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> v.updatePadding(bottom = insets.systemWindowInsets.bottom) // Return the insets so that they keep going down the view hierarchy insets } 

Aquí simplemente establecemos la sangría inferior de la view en el valor de sangría inferior de la ventana del sistema .

Nota : Si hace esto en un ViewGroup , probablemente quiera configurar android:clipToPadding="false" . Esto se debe al hecho de que todos los tipos de dibujo de clip están sangrados por defecto. Este atributo se usa comúnmente con RecyclerView , que discutiremos con más detalle en el próximo artículo.

Asegúrese de que su función de escucha sea idempotente. Si se llama varias veces con las mismas inserciones, el resultado debe ser idéntico cada vez. A continuación se muestra un ejemplo de una función no idempotente:

 ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> v.updatePadding(bottom = v.paddingBottom + insets.systemWindowInsets.bottom) insets } 

No debería haber aumentado (ala + =) en la sangría de la vista cada vez que se llama a la función de escucha. Las inserciones de ventanas pueden ocurrir en cualquier momento y varias veces durante la vida de la jerarquía de vistas .

Jetpack


Otra cosa que recomiendo tener en cuenta sobre las inserciones es el uso de la clase WindowInsetsCompat de Jetpack , independientemente de su versión mínima de SDK. La API WindowInsets ha mejorado y se ha expandido a lo largo de los años, y la versión de compatibilidad proporciona consistencia y comportamiento de API en todos los niveles de API.

Cuando los nuevos tipos de insertos disponibles en Android Q se ven afectados , el método de compatibilidad es un conjunto de valores que son válidos para el dispositivo host en todos los niveles de API. Para acceder a las nuevas API en Android X, androidx.core:core:1.2.0-xxx a androidx.core:core:1.2.0-xxx (ahora en alfa) o superior. Aquí puedes encontrar la última versión.

Vamos aún más lejos


Los métodos que mencioné anteriormente son la forma más fácil de usar la API WindowInsets [Compat], pero pueden hacer que su código sea demasiado largo y repetitivo. Anteriormente, escribí un artículo en el que describía en detalle los métodos que pueden aumentar drásticamente la ergonomía del procesamiento de las inserciones de ventanas utilizando carpetas de adaptadores. Puedes leerlo aquí.

En el próximo artículo, aprenderemos cómo manejar cualquier conflicto que pueda surgir entre los gestos de sus aplicaciones y los gestos del sistema.

Eso es todo. Estamos esperando a todos en el seminario web gratuito , en el que nuestro especialista hablará en detalle sobre el curso .

Source: https://habr.com/ru/post/480778/


All Articles