Visión general
JTastyToast es el sistema de notificaciones animadas de jdashboardUI para B4J.
No utiliza el Toast nativo de Android ni depende de GIFs para sus iconos. La implementación actual crea cada notificación sobre un B4XView, dibuja el icono en tiempo real con Canvas + JavaObject y anima tanto el icono como la entrada y salida del toast.
La fuente actual incluye 47 tipos de toast animados.
Dim Tasty As JTastyToast
Tasty.Initialize(MainForm.RootPane)
Tasty.Success("Task completed successfully!")
El toast aparece centrado horizontalmente cerca de la parte inferior del Parent, entra mediante una animación vertical y se cierra automáticamente al terminar la duración configurada.
Historia y evolución en B4X
El nombre Tasty Toast ya aparecía en el foro B4X en 2016 como una librería B4A que envolvía un proyecto Android externo. Aquella implementación dependía del Toast de Android y su duración estaba limitada principalmente a short / long.
Referencia histórica:
https://www.b4x.com/android/forum/threads/tasty-toast.69671/
JTastyToast de jdashboardUI es distinto: es una implementación nativa para B4J / JavaFX.
En febrero de 2026 se presentó públicamente JTastyToast HD dentro de jdashboardUI v23 con 17 animaciones, dibujo mediante Canvas / JavaObject, reemplazo de notificaciones para evitar solapamientos y tres duraciones globales.
Anuncio:
La fuente actual ha crecido mucho más: 47 métodos de notificación animada, además de degradados, alpha, color de fondo, color de texto, fuente personalizada y CornerRadius.
Firma real:
Initialize(Parent As B4XView)
Ejemplo recomendado:
Private Tasty As JTastyToast
Tasty.Initialize(MainForm.RootPane)
También puede inicializarse sobre cualquier B4XView:
Tasty.Initialize(MyPanel)
El tamaño y la posición se calculan a partir del Parent, por lo que conviene usar un contenedor que ya tenga Width y Height válidos.
Flujo real del toast
método público
↓
InternalShow
↓
elimina el toast anterior si existe
↓
calcula color, ancho y alto
↓
crea Panel + Canvas + Label
↓
lo coloca por debajo del Parent
↓
SetLayoutAnimated(600 ms)
↓
redibuja el icono aproximadamente cada 20 ms
↓
espera la duración
↓
HideToast
↓
SetLayoutAnimated(600 ms) hacia abajo
↓
RemoveViewFromParent
JTastyToast combina dos capas de animación:
- movimiento del toast completo;
- animación interna del icono dibujado sobre Canvas.
Posición y dimensiones
El toast termina:
- centrado horizontalmente;
- aproximadamente 40dip por encima del borde inferior del Parent.
Entrada:
600 ms
Salida:
600 ms
Altura normal:
50dip
Con texto largo:
75dip
El ancho del texto tiene un límite interno aproximado de 400dip y el ancho total se calcula como:
ancho visible del texto + 115dip
Cuando el texto supera el máximo, el Label activa wrap.
Dibujo HD en tiempo real
El icono utiliza un Canvas de aproximadamente:
45dip × 45dip
La implementación redibuja el GraphicsContext JavaFX aproximadamente cada:
20 ms
Esto permite pulsos, escalado, rotación, partículas, rebotes y otras animaciones sin GIFs externos.
Duración global
| Constante | Valor | Uso recomendado |
|---|---|---|
| LENGTH_SHORT | 2500 ms | confirmaciones rápidas |
| LENGTH_NORMAL | 4500 ms | información y warnings |
| LENGTH_LONG | 7000 ms | errores o mensajes largos |
Por defecto se utiliza LENGTH_NORMAL.
Tasty.setDuration(Tasty.LENGTH_SHORT)
Tasty.Success("Saved!")
Tasty.setDuration(Tasty.LENGTH_LONG)
Tasty.Error("The operation could not be completed.")
La duración queda activa para los mensajes posteriores.
Reemplazo automático
Solo permanece un toast activo.
Tasty.Info("Connecting...")
Tasty.Success("Connected")
El segundo reemplaza al primero. La clase también usa CurrentTag para detener un loop de animación que ya no pertenece al toast actual.
Esto evita que varias notificaciones se apilen.
Cerrar haciendo clic
El Panel completo responde al mouse.
ToastPanel_MouseClicked
→ HideToast
El usuario puede cerrarlo antes de que expire.
La API pública actual no expone un método Close o Dismiss.
Las 47 animaciones
Éxito y estado positivo
| Método | Uso sugerido |
|---|---|
| Success(Message) | operación completada |
| Done(Message) | proceso finalizado |
| Signal(Message) | conexión establecida |
| Battery(Message) | batería / carga |
| Money(Message) | pago o transacción |
| ElectricMeter(Message) | medición / energía |
Tasty.Success("Changes saved")
Tasty.Done("Export finished")
Tasty.Signal("Connection established")
Tasty.Battery("Battery fully charged")
Tasty.Money("Payment approved")
Tasty.ElectricMeter("Meter reading received")
Advertencia y atención
| Método | Uso sugerido |
|---|---|
| Warning(Message) | advertencia general |
| Virus(Message) | amenaza / antivirus |
| Bug(Message) | bug / diagnóstico |
| Confused(Message) | comando desconocido |
| Pin(Message) | ubicación |
| Cat(Message) | estado divertido |
| Dog(Message) | estado divertido |
| BoxCat(Message) | sorpresa |
Tasty.Warning("Check the entered values")
Tasty.Bug("Bug report created")
Tasty.Confused("Unknown command")
Tasty.Pin("Location saved")
Acción intensa
| Método | Uso sugerido |
|---|---|
| Rocket(Message) | lanzamiento / inicio |
| Fire(Message) | actividad intensa |
Información y sistema
| Método | Uso sugerido |
|---|---|
| Info(Message) | información general |
| Search(Message) | búsqueda |
| Cloud(Message) | nube |
| Download(Message) | descarga |
| Windows(Message) | entorno Windows |
| Sync(Message) | sincronización |
| Snow(Message) | modo / efecto invierno |
| Neutral(Message) | estado neutro |
| Config(Message) | configuración |
Datos y celebración
| Método | Uso sugerido |
|---|---|
| Mail(Message) | |
| Chart(Message) | datos / reporte |
| Confetti(Message) | celebración |
Error y emoción
| Método | Uso sugerido |
|---|---|
| Error(Message) | error |
| Angry(Message) | acción rechazada |
| Love(Message) | favorito / corazón |
| LoveFace(Message) | valoración positiva |
| Kirby(Message) | animación divertida |
| Cake(Message) | celebración |
Avisos y destacados
| Método | Uso sugerido |
|---|---|
| Bell(Message) | aviso |
| Star(Message) | favorito / destacado |
| Sunflower(Message) | estado positivo |
| Pacman(Message) | procesamiento divertido |
Neutral, utilidades y especiales
| Método | Uso sugerido |
|---|---|
| Gift(Message) | regalo |
| Ghost(Message) | elementos ocultos |
| Rainbow(Message) | tema / personalización |
| NoSignal(Message) | sin conectividad |
| Dice(Message) | azar |
| Lock(Message) | seguridad |
| Sad(Message) | sin resultados |
| FileAction(Message) | archivo |
| Bulb(Message) | idea |
Todos reciben un único parámetro:
Message As String
Colores predeterminados
Sin personalización, los métodos se agrupan alrededor de familias cromáticas:
| Familia | Color base aproximado |
|---|---|
| Success | teal / verde |
| Warning | amarillo / ámbar |
| Rocket / Fire | naranja |
| Info | azul |
| Mail / Chart / Confetti | violeta |
| Error / Love | rojo profundo |
| Bell / Star | marrón / dorado |
| Neutral / utilities | slate / gris |
Al activar degradados, algunos tipos usan combinaciones específicas de dos tonos.
UseGradient
Por defecto:
False
Activar:
Tasty.setUseGradient(True)
Tasty.setUseGradient(True)
Tasty.Success("Gradient success")
Tasty.Error("Gradient error")
Si se define BackColor personalizado, ese fondo sólido tiene prioridad sobre el degradado.
Alpha
Tasty.setAlpha(220)
La escala esperada es:
0 .. 255
En modo degradado se convierte a alpha CSS dividiendo el valor entre 255.
Tasty.setUseGradient(True)
Tasty.setAlpha(210)
Tasty.Info("Semi-transparent notification")
Nota
Con BackColor personalizado, la implementación actual asigna directamente ese color sólido y el alpha global no se mezcla automáticamente.
BackColor personalizado
Tasty.setBackColor(xui.Color_RGB(30, 30, 35))
Tasty.Info("Custom background")
El valor 0 significa “sin color personalizado”.
Tasty.setBackColor(0)
TextColor
Por defecto el texto es blanco.
Tasty.setTextColor(xui.Color_Yellow)
Restaurar comportamiento predeterminado:
Tasty.setTextColor(0)
Fuente personalizada
La fuente inicial se crea usando OpenSans-SemiBold.ttf con tamaño aproximado 15.
Tasty.setCustomFont(xui.CreateDefaultBoldFont(16))
Tasty.Success("Custom font")
CornerRadius
Campo público:
Tasty.CornerRadius = 18dip
Valor inicial:
25dip
Personalización completa
Dim Tasty As JTastyToast
Tasty.Initialize(MainForm.RootPane)
Tasty.CornerRadius = 18dip
Tasty.setDuration(Tasty.LENGTH_LONG)
Tasty.setUseGradient(True)
Tasty.setAlpha(225)
Tasty.setTextColor(xui.Color_White)
Tasty.setCustomFont(xui.CreateDefaultBoldFont(15))
Tasty.Download("Downloading update...")
Ejemplo de una operación real
Private Sub btnSync_Click
Tasty.setDuration(Tasty.LENGTH_NORMAL)
Tasty.Sync("Synchronizing with server...")
Sleep(1500)
If ServerAvailable Then
Tasty.Success("Synchronization complete")
Else
Tasty.NoSignal("Server not available")
End If
End Sub
El segundo mensaje reemplaza al primero.
Integración con jdashboard_WindowsStyle
Private ui As jdashboard_WindowsStyle
Private Tasty As JTastyToast
ui.Initialize(Me, MainForm, "ui", fx.Colors.RGB(30, 30, 46))
ui.RootPane.LoadLayout("Main")
Tasty.Initialize(ui.RootPane)
MainForm.Show
Tasty.Success("Application ready")
Así el toast se posiciona respecto al área visible de contenido de WindowsStyle.
Rendimiento
Mientras el toast está activo, Canvas se redibuja aproximadamente cada 20 ms.
Recomendaciones:
- úsalo para feedback importante, no como logger;
- evita decenas de llamadas por segundo;
- usa LENGTH_SHORT para confirmaciones frecuentes;
- reserva LENGTH_LONG para mensajes que necesiten lectura;
- recuerda que el toast nuevo reemplaza al activo.
Diferencia frente a un Toast tradicional
| JTastyToast | Toast tradicional |
|---|---|
| B4J / JavaFX | normalmente nativo del sistema |
| Canvas animado | icono estático o sin icono |
| 47 tipos actuales | pocas variantes |
| colores personalizados | limitado |
| degradados | poco habitual |
| alpha configurable | limitado |
| fuente personalizada | limitado |
| CornerRadius | configurable |
| reemplazo automático | depende de plataforma |
| se dibuja dentro de un Parent | mensaje del sistema |
API pública
Configuración
Initialize(Parent As B4XView)
setUseGradient(UseGradient As Boolean)
setDuration(DurationType As Int)
setAlpha(alpha As Double)
setBackColor(Clr As Int)
setTextColor(Clr As Int)
setCustomFont(fnt As B4XFont)
Campo:
CornerRadius As Int
Constantes:
LENGTH_SHORT
LENGTH_NORMAL
LENGTH_LONG
Métodos de notificación
Success
Signal
Battery
Money
Done
ElectricMeter
Virus
Warning
Cat
Dog
Bug
BoxCat
Confused
Pin
Rocket
Fire
Info
Search
Cloud
Download
Windows
Sync
Snow
Neutral
Config
Mail
Chart
Confetti
LoveFace
Love
Angry
Error
Kirby
Cake
Bell
Star
Sunflower
Pacman
Gift
Ghost
Rainbow
NoSignal
Dice
Lock
Sad
FileAction
Bulb
Detalles importantes de implementación
- un solo toast activo;
- el nuevo reemplaza al anterior;
- clic para cerrar;
- entrada de unos 600 ms;
- salida de unos 600 ms;
- Canvas de 45dip;
- wrap de texto;
- máximo interno de texto cercano a 400dip;
- posición final 40dip sobre el borde inferior;
- fondo sólido o degradado;
- BackColor personalizado tiene prioridad;
- no existe evento público de “toast cerrado”;
- no existe Close / Dismiss público.
Inicio rápido recomendado
Private Tasty As JTastyToast
Tasty.Initialize(MainForm.RootPane)
Tasty.setDuration(Tasty.LENGTH_NORMAL)
Tasty.setUseGradient(True)
Tasty.Success("Ready!")