# Como fazer fade (aparecer/desaparecer) de um componente

> Animar a opacidade de um componente com AlphaAnimation, aplicando o valor via alpha() e repintando sob demanda.

Source: https://crossfly.dev/pt/docs/cookbook/anim/fade — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Como fazer fade (aparecer/desaparecer) de um componente

**Propósito.** Fazer um componente surgir suavemente (0 → 1) ou desaparecer (1 → 0). `AlphaAnimation` interpola um `float` com ease-in-out; você aplica esse valor à opacidade do componente e força o repaint.

## APIs usadas
- `new AlphaAnimation(float start, float end, float duration [, float fps])` — cria a animação. `start`/`end` são **clampados a [0,1]**; interpolação **ease-in-out cubic**; `duration` em segundos; `fps` opcional (default 60).
- `AlphaAnimation.onUpdate(Runnable)` — callback a cada frame; leia `getValue()` aqui.
- `AlphaAnimation.onComplete(Runnable)` — callback ao chegar em `end` (também disparado por `stop()`).
- `AlphaAnimation.getValue()` — valor atual interpolado.
- `AlphaAnimation.start()` / `stop()` / `cancel()` — inicia / para (dispara `onComplete`) / cancela (não dispara).
- `Component.alpha(float)` — define a opacidade do componente (0–1, clampada). **Divergência de Javadoc:** o doc cita `setAlpha`, mas o método real é `alpha(...)`.
- `Component.repaint()` — método **estático**; solicita re-render (o CrossFly renderiza sob demanda, então é obrigatório chamar dentro do `onUpdate`).

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.animation.*;

/** Tela principal executável: aplica fade-in num Label ao abrir. */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Label c = new Label("Olá");
      add(c);

      // Declare a variável antes para poder ler getValue() dentro do onUpdate.
      AlphaAnimation anim = new AlphaAnimation(0f, 1f, 0.3f);       // 300 ms, 0 → 1
      anim.onUpdate(() ->
         {
            c.alpha(anim.getValue());   // aplica opacidade
            Component.repaint();        // render sob demanda: sem isto, o frame não é redesenhado
         })
         .onComplete(() -> Component.repaint())
         .start();
   }
}
```

> O trecho abaixo mostra **só o miolo**. Para rodar, coloque-o no esqueleto `MainWindow` acima.

## Trecho mínimo
```java
// verificado na fonte: AlphaAnimation clamp [0,1] ease-in-out; Component.alpha(float); Component.repaint() estático
Label c = new Label("Olá");
add(c);

// Declare a variável antes para poder ler getValue() dentro do onUpdate.
AlphaAnimation anim = new AlphaAnimation(0f, 1f, 0.3f);       // 300 ms, 0 → 1
anim.onUpdate(() ->
   {
      c.alpha(anim.getValue());   // aplica opacidade
      Component.repaint();        // render sob demanda: sem isto, o frame não é redesenhado
   })
   .onComplete(() -> Component.repaint())
   .start();
```

Notas:

- `alpha(1f)` (ou `>= 0.999`) remove a propriedade de opacidade (componente 100% opaco); `alpha(0f)` o torna invisível mas ainda presente no layout.
- Para fade-out use `new AlphaAnimation(1f, 0f, 0.3f)` e, no `onComplete`, `hide()`/remova o componente se quiser.
- **Sempre** chame `Component.repaint()` no `onUpdate` — o CrossFly só redesenha quando solicitado.

## Aprofunde-se
- [Animações de valor](/docs/ui/animations/value-animations)
- Receita irmã: [Pulso em loop](/docs/cookbook/anim/pulso-loop) · [Mover um componente](/docs/cookbook/anim/mover-componente)
- Relacionado: [Abrir e fechar uma tela](/docs/cookbook/nav/abrir-tela)
