Añadir un Floating Action Button (FAB) a una Activity en Android

El Floating Action Button (FAB) es un componente clave en el diseño de la interfaz de usuario para aplicaciones Android. Es un botón de gran énfasis que permite al usuario realizar una acción principal en una aplicación y se utiliza para representar la acción principal o más común en una pantalla.

Si tu aplicación tiene una acción que el usuario debe realizar, debes usar un FAB para esta acción. Forma parte de las directrices de Material Design desarrolladas por Google, que ofrecen un diseño simple pero atractivo para la interacción del usuario.

Ejemplo de Floating Action Button en una aplicación Android

¿Qué es un Floating Action Button?

Básicamente, es un tipo de botón, pero un poco "más rico" que los anteriores. Podemos cambiar el tamaño, añadir texto (en el caso del botón extendido) y, por supuesto, siempre tiene un icono. El FAB suele colocarse en una posición fija en la pantalla y puede animarse para realizar acciones relacionadas al interactuar con él.

Para crear un botón de acción flotante general, usa el elemento FloatingActionButton básico que admite composición. Puedes crear botones de acción flotante más complejos con el elemento ExtendedFloatingActionButton componible. La diferencia clave entre este y FloatingActionButton es que tiene parámetros de icono y texto dedicados.

Los botones de acción flotante pueden ser de dos tamaños:

  • El predeterminado (56dp)
  • Mini (40dp)

Implementación del FAB

Existen dos enfoques principales para implementar un FAB en Android: el moderno Jetpack Compose y el tradicional sistema de vistas basado en XML.

Floating Action Button con Jetpack Compose (el enfoque moderno)

Jetpack Compose es el kit de herramientas moderno recomendado por Google para construir interfaces de usuario nativas en Android. Su naturaleza declarativa simplifica enormemente el desarrollo de la interfaz de usuario.

En Jetpack Compose, la implementación del FAB es concisa, declarativa y mucho más intuitiva que el enfoque basado en XML.

Scaffold( floatingActionButton = { FloatingActionButton(onClick = { /* acción al hacer clic */ }) { Icon(Icons.Default.Add, contentDescription = "Añadir") } }) { // Contenido de la pantalla}

En este ejemplo:

  • Scaffold organiza la pantalla y nos da un espacio dedicado para el FAB (floatingActionButton).
  • FloatingActionButton es el elemento componible que crea el botón. Su lambda onClick define la acción a ejecutar.
  • Icon se utiliza para mostrar un icono dentro del FAB, utilizando los iconos de Material predefinidos (Icons.Default.Add).

Para crear un botón de acción flotante pequeño, usa el elemento SmallFloatingActionButton componible. Para crear un botón de acción flotante grande, usa el elemento LargeFloatingActionButton componible.

Floating Action Button con XML (enfoque heredado)

Aunque Jetpack Compose es el futuro, muchas aplicaciones existentes aún utilizan el sistema de vistas basado en XML.

Primero, asegúrate de tener la dependencia de Material Design en tu archivo build.gradle (módulo):

implementation("com.google.android.material:material:1.12.0")

Una vez modificada, Android Studio se sincronizará para descargar la biblioteca.

Instanciar el botón flotante en XML

Con la dependencia configurada, puedes añadir el FloatingActionButton a tu diseño XML.

<com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:src="@drawable/ic_add" android:contentDescription="Añadir nueva acción" />

Esquema de un FAB en un layout XML

Manejo de clics en el FAB con XML

Puedes manejar los clics del FAB configurando un OnClickListener para el FAB. En el método onClick(), puedes realizar la acción deseada o iniciar una animación. Si el FAB tiene múltiples acciones, puedes usar una declaración switch o condiciones if-else para manejar diferentes acciones.

En el archivo de actividad Java o Kotlin, puedes obtener una referencia al FAB y configurar un OnClickListener:

FloatingActionButton fab = findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Realizar acción o iniciar animación }});

Este enfoque elimina la necesidad de findViewById, evitando errores de puntero nulo y de conversión de tipo.

Android Studio App Móvil Tutorial 11 Float action Button

Animaciones en el Floating Action Button

Las animaciones siguen siendo una parte importante de la experiencia del usuario. Al interactuar con las aplicaciones en nuestros dispositivos, las animaciones añaden placer a la experiencia del usuario y crean una sensación de conexión entre los destinos vibrantes.

Una de las animaciones en Android que mejora la experiencia del usuario es la animación de explosión del FAB (Floating Action Button). Aquí, el usuario hace clic en el FAB y este explota para llenar toda la pantalla, cargándose la siguiente pantalla. Antes de la explosión, el FAB se encoge ligeramente para tener en cuenta la pulsación del usuario; esto, junto con la explosión, crea un viaje agradable a la siguiente pantalla.

Puedes animar un FAB en Android utilizando las API de animación de Android. Puedes usar ObjectAnimator para animaciones simples o AnimatorSet para animaciones complejas que involucren múltiples propiedades. También puedes usar el método animate() de la clase View para animaciones simples. La animación se puede activar por la interacción del usuario, como hacer clic en el FAB.

fab.animate() .scaleX(0f) .scaleY(0f) .alpha(0f) .setDuration(300) .withEndAction(() -> { // Acción al finalizar la animación fab.setScaleX(1f); fab.setScaleY(1f); fab.setAlpha(1f); });

Este código Kotlin es más limpio y utiliza withEndAction para encadenar la animación a su estado original.

Ejemplo de animación de un Floating Action Button

Animación de revelación circular

Para versiones de Android LOLLIPOP (API 21) y posteriores, se puede usar la animación de revelación circular. Esta animación puede ser muy atractiva visualmente.

Para un ejemplo más detallado, puedes crear una nueva actividad llamada RevealActivity. Asegúrate de que el archivo de diseño de esta actividad tenga un Floating Action Button. En el método onCreate() de RevealActivity, busca las referencias de vista del FAB y añade un listener de clic. La función toggleFabMenu() se utiliza para crear e iniciar la animación de revelación.

public void toggleFabMenu() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { int centerX = fab.getMeasuredWidth() / 2; int centerY = fab.getMeasuredHeight() / 2; float startRadius = 0; float endRadius = (float) Math.hypot(rootLayout.getWidth(), rootLayout.getHeight()); if (revealView.getVisibility() == View.VISIBLE) { Animator animator = ViewAnimationUtils.createCircularReveal(revealView, centerX, centerY, endRadius, startRadius); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(400); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); revealView.setVisibility(View.GONE); } }); animator.start(); } else { Animator animator = ViewAnimationUtils.createCircularReveal(revealView, centerX, centerY, startRadius, endRadius); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(400); revealView.setVisibility(View.VISIBLE); animator.start(); } } else { // Manejar versiones anteriores a LOLLIPOP }}

El método createCircularReveal() se utiliza para configurar la animación. Los siguientes dos parámetros son las coordenadas X e Y de la pantalla donde comenzará la animación. La animación comenzará en el centro de la vista con un radio inicial de "0" y el radio final se calcula con el método Math.hypot().

Comportamiento del FAB con el desplazamiento

En la mayoría de las aplicaciones de Android recientes, el FAB reacciona al desplazamiento de una lista de elementos y, en mi opinión, debería ocultarse mientras se desplaza. Puedes usar la clase FloatingActionButton.Behavior(), cuya función principal es mover las vistas de FloatingActionButton para que cualquier Snackbar que se muestre no las cubra.

Para usar este comportamiento, añade el atributo layout_behavior al Floating Action Button. El atributo contiene el nombre del paquete, más el nombre de la clase al final, o dicho de otra manera, la ubicación exacta de esta clase en el proyecto.

Personalización del FAB

Puedes personalizar la apariencia de un FAB configurando su color de fondo, icono y tamaño. También puedes añadir una sombra al FAB para un efecto 3D. El FAB debe ser fácilmente visible, pero también debe integrarse bien con el diseño general de tu aplicación.

FAB en un Fragment

Sí, puedes usar un FAB en un Fragment. Puedes añadir el FAB en el archivo XML del diseño del Fragment y manejar sus clics en el archivo Java o Kotlin del Fragment. El FAB solo será visible cuando el Fragment sea visible.

FAB para múltiples acciones (menú FAB)

Un FAB puede animarse en una serie de botones más pequeños, cada uno representando una acción diferente. Esto se conoce como menú FAB o menú de marcación rápida. Cada botón más pequeño puede tener su propio icono y etiqueta, y puede animarse de nuevo al FAB principal cuando se hace clic.

Ejemplo de menú FAB o speed dial

Al crear estas animaciones, se puede encontrar el problema de los eventos táctiles y los FAB pequeños. Cuando la animación termina, la posición real de los FAB pequeños no cambia, solo la vista aparece en la nueva posición, por lo que no se pueden realizar eventos táctiles en la posición correcta. Esto requiere un manejo cuidadoso de los eventos táctiles durante la animación.

Efecto de onda (Ripple Effect)

Puedes añadir un efecto de onda a un FAB configurando su fondo en un RippleDrawable. El efecto de onda se activará cuando se haga clic en el FAB, proporcionando una retroalimentación visual al usuario.

tags: #anadir #fab #a #activity