# स्पर्श और फ़ीडबैक

> pressable() के माध्यम से स्वचालित दबाव एनिमेशन और कॉम्पोनेंट के alpha का मैन्युअल नियंत्रण।

Source: https://crossfly.dev/hi/docs/ui/animations/press-and-feedback — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# स्पर्श और फ़ीडबैक

स्पर्श पर विज़ुअल प्रतिक्रिया (बटन का "धँसना") CrossFly में **स्वचालित** है जब स्टाइल को
दबाने-योग्य के रूप में चिह्नित किया जाता है — आप कोई एनिमेशन नहीं लिखते।

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

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;   // ComponentStyle

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // प्रेस पर स्वचालित फ़ीडबैक: .pressable() के साथ कस्टम स्टाइल
      Button botao = new Button("Enviar");
      botao.style(new ComponentStyle().backColor(0xFF0173ED).pressable());
      add(LAY_AUTO, botao);

      // स्टेट दर्शाने के लिए अपारदर्शिता का मैन्युअल नियंत्रण (चयनित/अक्षम)
      Label item = new Label("Item");
      add(LAY_AUTO, item);
      boolean selecionado = false;
      item.alpha(selecionado ? 1f : 0.5f);
      Component.repaint();

      // फ़ीडबैक के साथ स्टेट टॉगल करता है: टच करने पर आइटम को वापस अपारदर्शी उजागर करता है
      botao.onAction(c -> { item.alpha(1f); Component.repaint(); });
   }
}
```
> नीचे दिए गए स्निपेट **सिर्फ़ मूल भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, इन्हें ऊपर वाले `MainWindow` कंकाल में रखें।

## स्वचालित दबाव फ़ीडबैक — `pressable()`
स्टाइल को `pressable()` के रूप में चिह्नित करें और कॉम्पोनेंट स्पर्श होने पर स्वयं एनिमेट होता है (थीम की
`animationDuration` का उपयोग करते हुए):
```java
Button b = new Button("Enviar");
b.style(Styles.button());   // Skin का बटन स्टाइल पहले से ही .pressable() के साथ आता है

// कस्टम स्टाइल में, इसे स्पष्ट रूप से सक्षम करें:
b.style(new ComponentStyle().backColor(0xFF0173ED).pressable());
```
`Skin` सामान्य से `pressed` स्थिति उत्पन्न करता है (डिफ़ॉल्ट रूप से, गहरा पृष्ठभूमि)। अनुकूलित करने के लिए,
एक `pressedStyle(...)` परिभाषित करें (देखें [कॉम्पोनेंट स्टाइल करना](/docs/ui/theming/styling-components))।

## फ़ीडबैक की अवधि
यह `Styles.animationDuration` से आती है (डिफ़ॉल्ट `0.3s`) और `Skin` के स्टाइल्स द्वारा पढ़ी जाती है। वैश्विक समायोजन:
```java
Styles.animationDuration = 0.2f;   // पूरे ऐप में अधिक "तेज़" टच
```

## अपारदर्शिता का मैन्युअल नियंत्रण — `alpha(...)`
किसी कॉम्पोनेंट को स्वयं धुँधला/उभारने के लिए (उदा.: विज़ुअल रूप से अक्षम करना, चयन को हाइलाइट करना),
`alpha(float)` का उपयोग करें (0 = पारदर्शी, 1 = अपारदर्शी):
```java
item.alpha(selecionado ? 1f : 0.5f);
Component.repaint();
```
अपारदर्शिता के **सहज** ट्रांज़िशन के लिए, इसे [`AlphaAnimation`](/docs/ui/animations/value-animations) के साथ संयोजित करें:
```java
AlphaAnimation fade = new AlphaAnimation(item.alpha(), 1f, 0.2f);
fade.onUpdate(() -> { item.alpha(fade.getValue()); Component.repaint(); }).start();
```

## सर्वोत्तम अभ्यास
- स्पर्श फ़ीडबैक को `pressable()` संभालने दें — दबाव को हाथ से एनिमेट न करें।
- स्थिति (अक्षम/चयनित) के लिए `alpha()` का उपयोग करें; एनिमेट केवल तब करें जब ट्रांज़िशन कुछ जोड़े।
- एक **अक्षम** कॉम्पोनेंट स्टाइल के `disabledAlpha` से पहले ही धुँधला हो जाता है — इसे दोहराएँ नहीं।

## आम गलतियाँ
- `pressable()` के बिना कस्टम स्टाइल → स्पर्श पर बिना फ़ीडबैक वाला बटन।
- `alpha(...)` सेट करना और `Component.repaint()` भूल जाना (रेंडर माँग पर होता है)।

## यह भी देखें
- [मान एनिमेशन](/docs/ui/animations/value-animations) · [कॉम्पोनेंट स्टाइल करना](/docs/ui/theming/styling-components)
