# किसी कंपोनेंट का fade (प्रकट/अदृश्य होना) कैसे करें

> AlphaAnimation के साथ किसी कंपोनेंट की ओपेसिटी को एनिमेट करें, alpha() के माध्यम से वैल्यू लागू करते हुए और माँग पर पुनः पेंट करते हुए।

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

# किसी कंपोनेंट का fade (प्रकट/अदृश्य होना) कैसे करें

**उद्देश्य.** किसी कंपोनेंट को सहजता से प्रकट कराना (0 → 1) या अदृश्य कराना (1 → 0)। `AlphaAnimation` एक `float` को ease-in-out के साथ इंटरपोलेट करता है; आप उस वैल्यू को कंपोनेंट की ओपेसिटी पर लागू करते हैं और repaint को बाध्य करते हैं।

## उपयोग किए गए APIs
- `new AlphaAnimation(float start, float end, float duration [, float fps])` — एनिमेशन बनाता है। `start`/`end` **[0,1] में क्लैंप** किए जाते हैं; इंटरपोलेशन **ease-in-out cubic**; `duration` सेकंड में; `fps` वैकल्पिक (डिफ़ॉल्ट 60)।
- `AlphaAnimation.onUpdate(Runnable)` — प्रत्येक फ्रेम पर callback; यहाँ `getValue()` पढ़ें।
- `AlphaAnimation.onComplete(Runnable)` — `end` पर पहुँचने पर callback (`stop()` द्वारा भी ट्रिगर होता है)।
- `AlphaAnimation.getValue()` — वर्तमान इंटरपोलेटेड वैल्यू।
- `AlphaAnimation.start()` / `stop()` / `cancel()` — आरंभ / रोकता है (`onComplete` ट्रिगर करता है) / रद्द करता है (ट्रिगर नहीं करता)।
- `Component.alpha(float)` — कंपोनेंट की ओपेसिटी सेट करता है (0–1, क्लैंप की गई)। **Javadoc में विसंगति:** दस्तावेज़ `setAlpha` का उल्लेख करता है, पर वास्तविक मेथड `alpha(...)` है।
- `Component.repaint()` — **स्टैटिक** मेथड; री-रेंडर का अनुरोध करता है (CrossFly माँग पर रेंडर करता है, इसलिए `onUpdate` के भीतर इसे कॉल करना अनिवार्य है)।

## पूरा उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
```java
package com.exemplo;

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

/** चलाने योग्य मुख्य स्क्रीन: खुलने पर एक Label पर fade-in लागू करती है। */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

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

      // onUpdate के अंदर getValue() पढ़ने के लिए वेरिएबल को पहले घोषित करें।
      AlphaAnimation anim = new AlphaAnimation(0f, 1f, 0.3f);       // 300 ms, 0 → 1
      anim.onUpdate(() ->
         {
            c.alpha(anim.getValue());   // अपारदर्शिता लागू करता है
            Component.repaint();        // माँग पर रेंडर: इसके बिना, frame फिर से नहीं बनता
         })
         .onComplete(() -> Component.repaint())
         .start();
   }
}
```

> नीचे दिया गया अंश **केवल मुख्य भाग** दिखाता है। इसे चलाने के लिए, इसे ऊपर दिए गए `MainWindow` कंकाल में रखें।

## न्यूनतम अंश
```java
// स्रोत में सत्यापित: AlphaAnimation clamp [0,1] ease-in-out; Component.alpha(float); Component.repaint() static
Label c = new Label("Olá");
add(c);

// onUpdate के अंदर getValue() पढ़ने के लिए वेरिएबल को पहले घोषित करें।
AlphaAnimation anim = new AlphaAnimation(0f, 1f, 0.3f);       // 300 ms, 0 → 1
anim.onUpdate(() ->
   {
      c.alpha(anim.getValue());   // अपारदर्शिता लागू करता है
      Component.repaint();        // माँग पर रेंडर: इसके बिना, frame फिर से नहीं बनता
   })
   .onComplete(() -> Component.repaint())
   .start();
```

नोट्स:

- `alpha(1f)` (या `>= 0.999`) ओपेसिटी प्रॉपर्टी हटा देता है (कंपोनेंट 100% ओपेक); `alpha(0f)` इसे अदृश्य बना देता है पर लेआउट में अब भी मौजूद रहता है।
- fade-out के लिए `new AlphaAnimation(1f, 0f, 0.3f)` उपयोग करें और, `onComplete` में, यदि चाहें तो कंपोनेंट को `hide()`/हटाएँ।
- `onUpdate` में **हमेशा** `Component.repaint()` कॉल करें — CrossFly केवल अनुरोध किए जाने पर ही पुनः चित्रित करता है।

## और गहराई से जानें
- [वैल्यू एनिमेशन](/docs/ui/animations/value-animations)
- संबंधित रेसिपी: [लूप में पल्स](/docs/cookbook/anim/pulso-loop) · [किसी कंपोनेंट को हिलाना](/docs/cookbook/anim/mover-componente)
- संबंधित: [स्क्रीन खोलना और बंद करना](/docs/cookbook/nav/abrir-tela)
