# Switch

> एनिमेटेड स्लाइडिंग ट्रैक और वैकल्पिक लेबल वाला on/off स्विच।

Source: https://crossfly.dev/hi/docs/ui/widgets/switch — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Switch

`Switch` एक **चालू/बंद** स्विच है जिसमें गोल ट्रैक और एक "thumb" (स्लाइडिंग बटन) होता है जो off और on अवस्थाओं के बीच एनिमेटेड रूप से सरकता है। यह बगल में एक वैकल्पिक टेक्स्ट लेबल और on/off आइकन स्वीकार करता है जो ट्रांज़िशन में crossfade करते हैं। यह किसी तत्काल प्राथमिकता को सक्षम/अक्षम करने के लिए आदर्श नियंत्रण है, iOS/Material शैली में।

> 🟢 · **पैकेज:** `dev.crossfly.ui` · **विस्तार करता है:** `Component` (`Checkable`, `AlphaAnimation.Animate` लागू करता है) · **शैली:** `SwitchStyle`

## कब उपयोग करें
- तत्काल प्रभाव के साथ किसी एकल प्राथमिकता को चालू/बंद करना (उदा.: "सूचनाएँ सक्षम करें")।
- जहाँ उपयोगकर्ता एक दृश्य toggle की अपेक्षा करता हो, न कि चेकबॉक्स की।

## कब उपयोग न करें
- एक साथ दिखने वाले कई विकल्पों में से चुनने के लिए → [`group`](/docs/ui/widgets/group) के भीतर [`option`](/docs/ui/widgets/option) उपयोग करें।
- विकल्पों की बड़ी सूची के लिए → [`dropdown`](/docs/ui/widgets/dropdown) उपयोग करें।

## रूप-रंग
गोल ट्रैक (`trackRadius = trackH/2`) जिसमें एक वर्गाकार thumb `thumbMinX` (off) से `thumbMaxX` (on) तक चलता है। ट्रैक की चौड़ाई, ऊँचाई और thumb का आकार फ़ॉन्ट की ऊँचाई के समानुपाती होते हैं (`SwitchStyle` का `switchWidth`, `trackHeight`, `thumbSizeRatio`)। वैकल्पिक लेबल स्विच के बगल में रहता है; जब `iconAlignH == END` हो तो स्विच दाईं ओर और टेक्स्ट बाईं ओर जाता है, अन्यथा टेक्स्ट दाईं ओर रहता है।

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

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

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

      // Label जो switch की स्थिति दर्शाता है
      Label saida = new Label("Recurso: desligado");
      add(LAY_AUTO, saida);

      // रॉतल वाला Switch; onAction तभी चलता है जब स्थिति बदलती है
      Switch toggle = new Switch("Ativar recurso");
      toggle.checked(false);   // प्रारंभिक स्थिति, बिना एनिमेशन
      toggle.onAction(c -> saida.setText("Recurso: " + (toggle.checked ? "ligado" : "desligado")));
      add(LAY_AUTO, toggle);
   }
}
```

> नीचे के अंश **केवल मूल भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, उन्हें ऊपर दिए `MainWindow` कंकाल में रखें।

## बुनियादी उपयोग
```java
Switch toggle = new Switch("Ativar recurso");
toggle.checked(true);                                  // आरंभिक स्थिति, बिना एनिमेशन
toggle.onAction(c -> System.out.println("estado: " + toggle.checked));
container.add(LAY_AUTO, toggle);
```

## Constructors
| Constructor | विवरण |
|---|---|
| `Switch()` | अचयनित, लेबल रहित (केवल-आइकन मोड)। |
| `Switch(String text)` | अचयनित, बगल में लेबल के साथ। |

## गुण और अनुकूलन
| गुण / विधि | प्रकार | डिफ़ॉल्ट | क्या करता है |
|---|---|---|---|
| `text(String)` | `Switch` (fluente) | `null` | लेबल सेट करता है। |
| `checked(boolean)` | `Switch` (fluente) | `false` | एनिमेशन **रहित** प्रारंभिक अवस्था (`progress` सीधे समायोजित करता है); समूह को सूचित करता है। |
| `setChecked(boolean)` | `void` | — | एनिमेशन **सहित** अवस्था; समूह को सूचित करता है। |
| `toggle()` | `void` | — | अवस्था बदलता है (समूह का सम्मान करते हुए)। |
| `checked` | `boolean` (campo) | `false` | वर्तमान तार्किक अवस्था (पठन)। |
| `progress` | `float` (campo) | `0` | thumb की प्रक्षेपित स्थिति: `0` = off, `1` = on। |
| `.group(Group)` | `Switch` (fluente) | — | पारस्परिक अपवर्जन के लिए किसी [`group`](/docs/ui/widgets/group) से जोड़ता है। |

## Callbacks और घटनाएँ
| Callback | कब ट्रिगर होता है |
|---|---|
| `onAction(Action)` | `onTouchUp` में, **केवल तभी** जब अवस्था (`checked`) बदली हो। |

## अवस्थाएँ
- **checked / unchecked**: `checked(boolean)` (एनिमेशन रहित) या `setChecked(boolean)` (एनिमेशन सहित) द्वारा नियंत्रित। `checked` फ़ील्ड अवस्था दर्शाता है।
- **एनिमेशन में**: `progress` `AlphaAnimation` के माध्यम से 0 से 1 (या इसके विपरीत) संक्रमित होता है (अवधि = `style.animationDuration`)।
- **समूह में**: `toggle()` किसी समूह के पहले से चयनित स्विच को **अचयनित नहीं करता** (रेडियो व्यवहार)।

### किसी Group में परस्पर अनन्य कई स्विच (रेडियो)
```java
Group modo = new Group();

Switch claro  = new Switch("Tema claro").group(modo).checked(true);
Switch escuro = new Switch("Tema escuro").group(modo);

container.add(LAY_AUTO, claro);
container.add(LAY_AUTO, escuro);
// किसी एक को चुनने पर दूसरा अपने आप अनचेक हो जाता है।
```

## अच्छे अभ्यास
- प्रारंभिक अवस्था के लिए `checked(boolean)` को प्राथमिकता दें (`progress` और समूह को एक साथ समायोजित करता है); runtime में एनिमेटेड ट्रांज़िशन चाहिए तो `setChecked` उपयोग करें।
- `onAction` के भीतर `isChecked()` या `checked` फ़ील्ड द्वारा अवस्था पढ़ें।

## सामान्य गलतियाँ
- हर इंटरैक्शन पर `onAction` ट्रिगर होने की अपेक्षा करना: यह केवल तभी ट्रिगर होता है जब `checked` **बदलता** है।
- किसी `Group` के भीतर पहले से चयनित स्विच पर क्लिक करके उसे "बंद" करने का प्रयास: `toggle()` इसे रोकता है (रेडियो)।

## यह भी देखें
- क्षेत्र गाइड: [`ui/`](/docs/ui) · रेसिपी: [`cookbook/`](/docs/cookbook)
- अवधारणा (अवस्था के अनुसार शैलियाँ): [`concepts/`](/docs/concepts)
- संबंधित घटक: [`option`](/docs/ui/widgets/option) · [`group`](/docs/ui/widgets/group)
