# Slider

> किसी अंतराल में एक float मान का चयन, निरंतर या चरणों में।

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

# Slider

`Slider` एक knob खींचकर `[min, max]` अंतराल के भीतर एक `float` मान चुनने देता है। यह **निरंतर** या **असतत** (चरणों के साथ, `npos` के माध्यम से) हो सकता है। अभिविन्यास स्वचालित रूप से पहचाना जाता है: **क्षैतिज** यदि `largura ≥ altura`, अन्यथा **ऊर्ध्वाधर**। knob के बाहर स्पर्श करने पर स्पर्श किए गए बिंदु तक सहजता से एनिमेट होता है; खींचने पर मान निरंतर अद्यतन होता है।

> 🟢 · **पैकेज:** `dev.crossfly.ui` · **विस्तार करता है:** `Component` · **शैली:** `SliderStyle` (दबाए गए संस्करण `sliderPressed()` के साथ)

## कब उपयोग करें
- निरंतर या अनुमानित मान: वॉल्यूम, चमक, श्रेणियाँ, ज़ूम।
- कुछ असतत चरणों में चयन (उदा.: 1 से 5) `npos` के साथ।

## कब उपयोग न करें
- जब उपयोगकर्ता को सटीक संख्या टाइप करने की आवश्यकता हो → संख्यात्मक मोड में [`textfield`](/docs/ui/widgets/textfield) उपयोग करें।

## रूप-रंग
दो खंडों में एक बार — **भरा हुआ** (knob से पहले) और **खाली** (बाद में) — साथ में knob। प्रत्येक खंड (`bx1/by1/bw1/bh1`, `bx2/by2/bw2/bh2`) और knob (`kx/ky/ks`) के निर्देशांक layout में परिकलित होते हैं (सभी `float`)। बार की मोटाई `thickness * fontHeight` है; knob `knobSize * fontHeight` है (`SliderStyle` से)।

## पूरा उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
```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 saida = new Label("Volume: 50");
      add(LAY_AUTO, saida);

      // निरंतर Slider 0..100, 50 से शुरू; onAction हर value बदलाव पर चलता है
      Slider volume = new Slider(0, 100, 50);
      volume.onAction(c -> saida.setText("Volume: " + (int) volume.value));
      add(LAY_AUTO, volume);
   }
}
```

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

## बुनियादी उपयोग
```java
Slider volume = new Slider(0, 100, 50);                 // निरंतर, 50 से शुरू
volume.onAction(c -> System.out.println("valor: " + volume.value));
container.add(LAY_AUTO, volume);
```

## Constructors
| Constructor | विवरण |
|---|---|
| `Slider(float min, float max, float value)` | **निरंतर** slider। |
| `Slider(float min, float max, float value, int npos)` | **असतत** slider: `npos` स्थितियाँ (उदा.: `5` → 0%, 25%, 50%, 75%, 100% पर चरण)। |

## गुण और अनुकूलन
| गुण / विधि | प्रकार | डिफ़ॉल्ट | क्या करता है |
|---|---|---|---|
| `value` | `float` (campo) | ctor | वर्तमान मान (पठन)। |
| `min` / `max` | `float` (campo) | ctor | अंतराल की सीमाएँ। |
| `npos` | `int` (campo) | `0` | असतत स्थितियों की संख्या; `0` = निरंतर। |
| `setValue(float)` | `void` | — | मान तुरंत सेट करता है (= `setValue(v, false)`); `clamp` + `snap` लागू करता है। |
| `setValue(float, boolean animated)` | `void` | — | एनिमेशन सहित/रहित मान सेट करता है; `runActions()` ट्रिगर करता है। |

## Callbacks और घटनाएँ
| Callback | कब ट्रिगर होता है |
|---|---|
| `onAction(Action)` | `value` में प्रत्येक परिवर्तन पर (खींचना, tap एनिमेशन और `setValue`)। |

## अवस्थाएँ
- **dragging**: जब तक उपयोगकर्ता knob खींचता है (`onPan`), प्रत्येक गति पर `value` अद्यतन होता है।
- **tap-to-jump**: knob के बाहर स्पर्श करने पर स्पर्श किए गए बिंदु तक एनिमेट होता है (`PositionAnimation`, अवधि `style.animationDuration`)।
- **pressed**: अपनी दबाई गई शैली (`sliderPressed()`) उपयोग करता है।

### 5 पड़ावों वाला असतत slider
```java
Slider nivel = new Slider(0, 100, 50, 5);               // चरण: 0,25,50,75,100
nivel.onAction(c -> System.out.println("nível: " + nivel.value));
container.add(LAY_AUTO, nivel);

nivel.setValue(75, true);   // 75 तक एनिमेट होता है (निकटतम चरण पर snap होगा)
```

## अच्छे अभ्यास
- `[min, max]` के भीतर एक प्रारंभिक `value` पास करें: **constructor clamp नहीं करता** (केवल `setValue` करता है)।
- ऊर्ध्वाधर अभिविन्यास बाध्य करने के लिए, layout में slider को चौड़ाई से अधिक ऊँचाई दें।

## सामान्य गलतियाँ
- स्थिर अभिविन्यास मान लेना: यह layout में चौड़ाई/ऊँचाई अनुपात द्वारा तय होता है।
- `npos > 0` के साथ निरंतर मानों की अपेक्षा करना: असतत मोड में मान हमेशा निकटतम चरण पर "snapped" होता है।

## यह भी देखें
- क्षेत्र गाइड: [`ui/`](/docs/ui) · रेसिपी: [`cookbook/`](/docs/cookbook)
- अवधारणा (layout और उत्तरदायित्व): [`concepts/`](/docs/concepts)
- संबंधित घटक: [`progress`](/docs/ui/widgets/progress)
