# किसी कंपोनेंट को उसकी स्थिति एनिमेट करके कैसे हिलाएँ

> PositionAnimation (पिक्सेल में रैखिक इंटरपोलेशन) के साथ किसी कंपोनेंट को एक बिंदु से दूसरे बिंदु तक सरकाएँ।

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

# किसी कंपोनेंट को उसकी स्थिति एनिमेट करके कैसे हिलाएँ

**उद्देश्य.** किसी कंपोनेंट की **पिक्सेल में स्थिति** को एनिमेट करना (जैसे: एक कार्ड को दाईं ओर से केंद्र की ओर सरकाना)। `PositionAnimation` रैखिक रूप से इंटरपोलेट करता है और [0,1] में क्लैंप **नहीं** किया जाता — निर्देशांकों के लिए आदर्श।

## उपयोग किए गए APIs
- `new PositionAnimation(float start, float end, float duration [, float fps])` — `start → end` को **रैखिक रूप से** इंटरपोलेट करता है, **बिना क्लैंप के**; `duration` सेकंड में; `fps` वैकल्पिक (डिफ़ॉल्ट 60)।
- `PositionAnimation.onUpdate(Runnable)` / `onComplete(Runnable)` / `getValue()` / `start()` / `stop()` / `cancel()` — `AlphaAnimation` का ही परिवार।
- `Component.setX(int)` / `Component.setY(int)` — कंपोनेंट को पुनः स्थापित करते हैं (`Component` लौटाते हैं)। विकल्प: जब आकार भी बदलना हो तब `setBounds(int x, int y, int w, int h)`।
- `Component.getY()` / `getWidth()` / `getHeight()` — उन अक्षों को संरक्षित करने के लिए जो एनिमेट नहीं हो रहे।
- `Component.repaint()` — स्टैटिक; `onUpdate` में अनिवार्य (माँग पर रेंडर)।

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

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

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

      Card card = new Card();
      add(card);

      int fromX = Screen.width;          // स्क्रीन के बाहर, दाईं ओर से शुरू होता है
      int toX   = (Screen.width - card.width) / 2;   // क्षैतिज रूप से केंद्रित करता है

      PositionAnimation slide = new PositionAnimation(fromX, toX, 0.4f);   // 400 ms
      slide.onUpdate(() ->
         {
            card.x = (int) slide.getValue();     // केवल X अक्ष हिलाता है; Y बना रहता है (x एक public फ़ील्ड है)
            Component.repaint();                 // इसके बिना frame फिर से नहीं बनता
         })
         .onComplete(() -> Component.repaint())
         .start();
   }
}
```

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

## न्यूनतम अंश
```java
// स्रोत में सत्यापित: PositionAnimation linear बिना clamp; Component.setX(int)/setY(int); repaint() static
Card card = new Card();
add(card);

int fromX = Screen.width;          // स्क्रीन के बाहर, दाईं ओर से शुरू होता है
int toX   = (Screen.width - card.getWidth()) / 2;   // क्षैतिज रूप से केंद्रित करता है

PositionAnimation slide = new PositionAnimation(fromX, toX, 0.4f);   // 400 ms
slide.onUpdate(() ->
   {
      card.setX((int) slide.getValue());   // केवल X अक्ष हिलाता है; Y बना रहता है
      Component.repaint();                 // इसके बिना frame फिर से नहीं बनता
   })
   .onComplete(() -> Component.repaint())
   .start();
```

विवरण:

- यदि आपको X **और** Y दोनों को एक साथ हिलाना हो, तो **दो** `PositionAnimation` उपयोग करें (प्रति अक्ष एक) या `onUpdate` में दोनों की गणना करते हुए `setBounds(x, y, w, h)` लागू करें।
- `setX`/`setY` पैरेंट में **निरपेक्ष** स्थिति बदलते हैं; स्वचालित लेआउट वाली स्क्रीनों में, ऐसे कंपोनेंट्स को एनिमेट करना पसंद करें जिनके bounds को आप सीधे नियंत्रित करते हैं (`Layout` से लड़ने से बचें)।
- `AlphaAnimation` के विपरीत, यहाँ कोई easing **नहीं** है: गति स्थिर रहती है। सहज गति के लिए, अपने स्वयं के फ़ंक्शन में एक easing चेन करें या ओपेसिटी इफ़ेक्ट के लिए `AlphaAnimation` के साथ मिलाएँ।

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