Animated API: τι είναι, δυνατότητες της βιβλιοθήκης και αρχή λειτουργίας

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-06 Χρόνος ανάγνωσης: 8 λεπ

Το Animated API είναι μια ενσωματωμένη βιβλιοθήκη δηλωτικού κινούμενου σχεδίου στο React Native που παρέχει κίνηση 60 FPS χωρίς φόρτωση του νήματος JavaScript. Σύμφωνα με την επίσημη τεκμηρίωση του React Native 0.76 (2025), το Animated API υποστηρίζει useNativeDriver για όλους τους τύπους κινήσεων, μεταφέροντας τους υπολογισμούς στο εγγενές νήμα μέσω του UI Manager. Η βιβλιοθήκη επιτρέπει τη δημιουργία σύνθετων αλυσίδων κίνησης, διαδραστικών χειρονομιών και παρεμβολής οποιωνδήποτε ιδιοτήτων στυλ — από τη διαφάνεια έως τον μετασχηματισμό.

Βασικά σημεία

  • Animated API — δηλωτική βιβλιοθήκη κίνησης React Native με υποστήριξη εγγενούς προγράμματος οδήγησης
  • Animated.Value — βασικό στοιχείο που αποθηκεύει αριθμητική τιμή και εγγράφει στοιχεία σε αλλαγές
  • useNativeDriver — επιλογή που μεταφέρει την κίνηση στο εγγενές νήμα για 60 FPS χωρίς τρεμόπαιγμα
  • Παρεμβολή — μηχανισμός μετατροπής αριθμητικών περιοχών σε χρώματα, γωνίες, συντεταγμένες και κλίμακα
  • Σύνθεση — διαδοχικές, παράλληλες και αλυσιδωτές κινήσεις μέσω sequence, parallel και stagger

Τι είναι το Animated API στο React Native

Animated API είναι μια δηλωτική βιβλιοθήκη κίνησης ενσωματωμένη στον πυρήνα του React Native, σχεδιασμένη για τη δημιουργία ομαλών, υψηλής απόδοσης κινήσεων σε εφαρμογές για κινητά. Σε αντίθεση με τις κινήσεις CSS στην ανάπτυξη ιστού, το Animated API λειτουργεί απευθείας με το εγγενές νήμα UI μέσω της γέφυρας JavaScript ή του εγγενούς προγράμματος οδήγησης. Η βιβλιοθήκη είναι χτισμένη γύρω από την έννοια του Animated.Value — ενός δοχείου που αποθηκεύει μια αριθμητική τιμή και εγγράφει αυτόματα όλα τα εξαρτώμενα στοιχεία στις αλλαγές. Όταν η τιμή αλλάζει μέσω Animated.timing ή Animated.spring, η βιβλιοθήκη υπολογίζει τις ενδιάμεσες καταστάσεις χωρίς επαναφορά των στοιχείων React, κάτι που είναι κρίσιμο για τη διατήρηση των 60 FPS. Το Animated API υποστηρίζει όλες τις ιδιότητες στυλ, συμπεριλαμβανομένων των transform, opacity, width, height, top, left και backgroundColor. Η τεκμηρίωση του React Native συνιστά το Animated API για όλα τα σενάρια κίνησης όπου απαιτείται υψηλή απόδοση και προβλέψιμη συμπεριφορά και στις δύο πλατφόρμες.

Πώς λειτουργεί το Animated API: Value, timing και spring

Η βάση του Animated API είναι το Animated.Value, ένα δοχείο αριθμητικής τιμής που αρχικοποιείται μέσω του κατασκευαστή new Animated.Value(0). Κάθε Animated.Value αποθηκεύει έναν αρχικό αριθμό και παρέχει μεθόδους κίνησης: timing, spring και decay. Η μέθοδος timing δημιουργεί μια γραμμική ή easing κίνηση με παραμέτρους duration, delay και easing. Η μέθοδος spring υλοποιεί μια φυσική κίνηση ελατηρίου με παραμέτρους friction, tension και velocity. Η μέθοδος decay δημιουργεί μια κίνηση με αδράνεια και απόσβεση — χρήσιμη για swipes και κύλιση. Όλες οι μέθοδοι επιστρέφουν ένα αντικείμενο Animated.Composite που μπορεί να ξεκινήσει μέσω start() και να σταματήσει μέσω stop(). Η κίνηση εκτελείται σε ξεχωριστό νήμα: όταν χρησιμοποιείται useNativeDriver = true, οι υπολογισμοί γίνονται στο εγγενές νήμα UI, το νήμα JavaScript παραμένει ελεύθερο για την επεξεργασία γεγονότων και λογικής.

Animated.timing: ρύθμιση διάρκειας και easing

Animated.timing είναι η βασική μέθοδος κίνησης με ελεγχόμενη διάρκεια. Δέχεται διαμόρφωση: toValue, duration (προεπιλογή 500ms), easing (προεπιλογή Easing.linear) και delay. Οι συναρτήσεις easing από την ενότητα Easing επιτρέπουν μη γραμμική επιτάχυνση: Easing.bezier, Easing.elastic, Easing.bounce. Για κίνηση με ομοιόμορφη ταχύτητα χρησιμοποιήστε Easing.linear, για φυσική επιτάχυνση — Easing.inOut. Σημαντικό: Το Animated.timing εγγυάται ότι η κίνηση θα ολοκληρωθεί ακριβώς στο toValue εντός του καθορισμένου χρόνου, ανεξάρτητα από το φορτίο της συσκευής.

Animated.spring: φυσική κίνηση

Animated.spring υλοποιεί ένα μοντέλο κίνησης ελατηρίου βασισμένο στον νόμο του Hooke. Η παράμετρος friction (τριβή) ελέγχει τον αριθμό ταλαντώσεων: όσο υψηλότερο είναι το friction, τόσο ταχύτερη είναι η διακοπή. Η παράμετρος tension (τάση) καθορίζει την ακαμψία του ελατηρίου: το υψηλό tension επιταχύνει την κίνηση. Η παράμετρος velocity ορίζει την αρχική ταχύτητα για κίνηση με αδράνεια — κρίσιμη για κινήσεις που ακολουθούν τη χειρονομία του χρήστη. Το Animated.spring δεν έχει σταθερή διάρκεια — η κίνηση τελειώνει όταν η ταχύτητα και το πλάτος φτάσουν τις οριακές τιμές.

Animated.View, Animated.Text και άλλα στοιχεία

Το Animated API παρέχει τέσσερα ενσωματωμένα κινούμενα στοιχεία: Animated.View, Animated.Text, Animated.ScrollView και Animated.Image. Κάθε ένα είναι ένα περιτύλιγμα πάνω από το αντίστοιχο εγγενές στοιχείο που υποστηρίζει τη μεταβίβαση Animated.Value σε ιδιότητες στυλ. Το Animated.View είναι το πιο συχνά χρησιμοποιούμενο στοιχείο, δέχεται τα ίδια props με ένα κανονικό View, αλλά με υποστήριξη για κινούμενες τιμές στο style. Το Animated.Text είναι χρήσιμο για κίνηση χρώματος κειμένου ή διαστήματος μεταξύ γραμμάτων. Το Animated.ScrollView επιτρέπει κίνηση των scrollTo και contentOffset. Το Animated.Image υποστηρίζει κινούμενη διαφάνεια και κλίμακα κατά τη φόρτωση εικόνων. Εάν χρειάζεστε κίνηση άλλου στοιχείου, χρησιμοποιήστε Animated.createAnimatedComponent(MyComponent).

js
import React from 'react';
import { Animated, View, Button } from 'react-native';

const FadeInView = () => {
  const opacity = useRef(new Animated.Value(0)).current;

  const fadeIn = () => {
    Animated.timing(opacity, {
      toValue: 1,
      duration: 1000,
      useNativeDriver: true,
    }).start();
  };

  return (
    View
      Animated.View { style: [{ opacity }] }
      Button title="Fade In" onPress={fadeIn}
  );
};

Σύστημα παρεμβολής: από αριθμούς σε χρώμα και μετασχηματισμούς

Παρεμβολή είναι ένας μηχανισμός μετατροπής της εισερχόμενης αριθμητικής περιοχής του Animated.Value σε τιμές εξόδου άλλου τύπου. Η μέθοδος interpolate δέχεται διαμόρφωση με inputRange (πίνακας εισερχόμενων τιμών) και outputRange (πίνακας εξερχόμενων τιμών). Τύποι outputRange: αριθμοί (συντεταγμένες, διαφάνεια), συμβολοσειρές (γωνίες περιστροφής με 'deg'), χρώματα hex ('#ff0000'), αντικείμενα μετασχηματισμού. Η παρεμβολή υποστηρίζει easing και extrapolate — συμπεριφορά εκτός του καθορισμένου εύρους (clamp, extend, identity). Για παράδειγμα, σε μια χειρονομία σύρσης, η θέση του δακτύλου από 0 έως 200 μπορεί να μετατραπεί σε διαφάνεια από 1 έως 0, δημιουργώντας ένα εφέ εξασθένισης κατά την ολίσθηση. Το σύστημα παρεμβολής επιτρέπει τη δημιουργία σύνθετων κινήσεων πολλαπλών βημάτων: η τιμή 0-0.5-1.0 μπορεί να μετατραπεί σε κίτρινο-πορτοκαλί-κόκκινο.

js
const spinValue = new Animated.Value(0);

Animated.timing(spinValue, {
  toValue: 1,
  duration: 3000,
  easing: Easing.linear,
  useNativeDriver: true,
}).start();

const spin = spinValue.interpolate({
  inputRange: [0, 1],
  outputRange: ['0deg', '360deg'],
});

Σύνθεση κινήσεων: ακολουθία και παραλληλία

Το Animated API υποστηρίζει τρεις λειτουργίες σύνθεσης κινήσεων: Animated.sequence, Animated.parallel και Animated.stagger. Το Animated.sequence ξεκινά κινήσεις μία προς μία: κάθε επόμενη ξεκινά μετά την ολοκλήρωση της προηγούμενης. Το Animated.parallel ξεκινά όλες τις κινήσεις ταυτόχρονα με ένα κοινό callback ολοκλήρωσης. Το Animated.stagger ξεκινά κινήσεις με καθυστέρηση μεταξύ της έναρξης κάθε μίας — καθυστερημένη έναρξη, χρήσιμη για τη δημιουργία εφέ κυμάτων. Οι συνθέσεις μπορούν να φωλιαστούν η μία μέσα στην άλλη: sequence από ομάδες parallel ή parallel από sequence. Αυτό επιτρέπει τη δημιουργία σύνθετων αλυσίδων: κίνηση εμφάνισης στοιχείων με καθυστέρηση, παράλληλο slide-in με fade-in, στη συνέχεια sequence από bounce και shake.

js
Animated.sequence([
  Animated.timing(fadeAnim, {
    toValue: 1,
    duration: 500,
    useNativeDriver: true,
  }),
  Animated.parallel([
    Animated.timing(scaleAnim, {
      toValue: 1.1,
      duration: 200,
      useNativeDriver: true,
    }),
    Animated.spring(colorAnim, {
      toValue: 1,
      friction: 4,
      useNativeDriver: true,
    }),
  ]),
]).start();

useNativeDriver και απόδοση κινήσεων

useNativeDriver είναι μια επιλογή διαμόρφωσης κίνησης που μεταφέρει όλη τη λογική κίνησης από το νήμα JavaScript στο εγγενές νήμα UI. Χωρίς useNativeDriver, οι κινήσεις εκτελούνται μέσω της γέφυρας JavaScript: κάθε αλλαγή τιμής αποστέλλεται στο εγγενές νήμα, προκαλώντας καθυστερήσεις όταν το νήμα JS είναι φορτωμένο με ασύγχρονες λειτουργίες. Με useNativeDriver = true, το Animated.Value ενημερώνεται απευθείας στην εγγενή πλευρά και το νήμα JavaScript παραμένει ελεύθερο για την επεξεργασία γεγονότων, αιτημάτων API και συμφιλίωσης React. Περιορισμός: το useNativeDriver υποστηρίζει μόνο μη-layout ιδιότητες — opacity, transform, backgroundColor (μέσω PlatformColor). Για ιδιότητες layout (width, height, top, left) απαιτείται NativeAnimatedModule ή LayoutAnimation. Σύμφωνα με το React Native 0.76, όλες οι κινούμενες ιδιότητες υποστηρίζονται μέσω εγγενούς προγράμματος οδήγησης, εκτός από αυτές που βασίζονται σε layout. Η λειτουργία useNativeDriver συνιστάται για όλες τις κινήσεις όπου είναι δυνατό — αυξάνει τα FPS από 30-40 σε σταθερά 60.

Κίνηση με χειρονομίες: PanResponder και Gesture Handler

PanResponder είναι ένα ενσωματωμένο σύστημα React Native για την επεξεργασία χειρονομιών, το οποίο ενσωματώνεται άριστα με το Animated API. Το PanResponder παρέχει callbacks onPanResponderMove και onPanResponderRelease, όπου το Animated.Value μπορεί να ενημερωθεί με βάση τη θέση του δακτύλου. Για πιο σύνθετες χειρονομίες — swipe, pinch, rotation — χρησιμοποιήστε τη βιβλιοθήκη react-native-gesture-handler, η οποία λειτουργεί σύγχρονα με κινήσεις και εξασφαλίζει 60 FPS ακόμη και σε χειρονομίες πολλαπλών δακτύλων. Το Gesture Handler παρέχει το Animated.event — μια μέθοδο που συνδέει άμεσα τη χειρονομία με το Animated.Value χωρίς χειροκίνητη επεξεργασία callback. Ο συνδυασμός Gesture Handler + Animated API είναι το βιομηχανικό πρότυπο για διαδραστικές κινήσεις σε εφαρμογές React Native.

Animated.event: σύνδεση χειρονομιών με τιμές

Animated.event είναι μια μέθοδος που συνδέει το εγγενές γεγονός (π.χ. gestureEvent) απευθείας με το Animated.Value. Σε αντίθεση με τη χειροκίνητη επεξεργασία σε callback, το Animated.event λειτουργεί σύγχρονα στο εγγενές νήμα και δεν απαιτεί γέφυρα JavaScript για κάθε καρέ. Αυτό παρέχει ομαλή κίνηση ακόμη και σε γρήγορα swipes. Το Animated.event δέχεται έναν πίνακα αντιστοιχίσεων, όπου κάθε στοιχείο συνδέει ένα πεδίο γεγονότος με το Animated.Value. Υποστηρίζεται ένθετη πρόσβαση: Animated.event([{ nativeEvent: { translationX: xValue } }]).

Παραδείγματα κώδικα με Animated API

Ας εξετάσουμε τρία πρακτικά παραδείγματα χρήσης του Animated API σε έργα React Native. Το πρώτο παράδειγμα — κίνηση εμφάνισης κάρτας με ακολουθία opacity + translateY. Το δεύτερο παράδειγμα — κίνηση παλμού κουμπιού χρησιμοποιώντας spring. Το τρίτο παράδειγμα — διαδραστικό στοιχείο σύρσης με PanResponder. Όλα τα παραδείγματα χρησιμοποιούν useNativeDriver = true και συμμορφώνονται με τις βέλτιστες πρακτικές του React Native 0.76.

js
const CardWithAnimation = () => {
  const anim = useRef(new Animated.Value(0)).current;

  React.useEffect(() => {
    Animated.spring(anim, {
      toValue: 1,
      friction: 6,
      tension: 40,
      useNativeDriver: true,
    }).start();
  }, []);

  const translateY = anim.interpolate({
    inputRange: [0, 1],
    outputRange: [50, 0],
  });

  return (
    Animated.View {
      style: [{ opacity: anim, transform: [{ translateY }] }]
    }
  );
};

Κίνηση παλμού μέσω spring

Spring κίνηση δημιουργεί ένα φυσικό εφέ παλμού χάρη στο φυσικό μοντέλο ελατηρίου. Η ρύθμιση χαμηλού friction (2-4) και υψηλού tension (100-150) δίνει απαλές ταλαντώσεις που εξασθενούν φυσικά. Χρησιμοποιήστε Animated.loop για ατέρμονο παλμό με κύκλο sequence: scale → 1.2, scale → 1.0. Ο παλμός εφαρμόζεται για δείκτες φόρτωσης, ειδοποιήσεις και τονισμένα κουμπιά.

Συχνές ερωτήσεις

Σε τι διαφέρει το Animated API από το LayoutAnimation;

Animated API δίνει πλήρη έλεγχο στην κίνηση — διάρκεια, easing, παρεμβολή, σύνθεση. Το LayoutAnimation είναι ένα ενσωματωμένο σύστημα React Native για κίνηση αλλαγών διάταξης με αυτόματη παρεμβολή. Το Animated API απαιτεί ρητή δήλωση του Animated.Value και διαμόρφωση, αλλά επιτρέπει τη δημιουργία σύνθετων αλυσίδων. Το LayoutAnimation ενεργοποιείται αυτόματα κατά την αλλαγή κατάστασης και είναι απλούστερο στη χρήση, αλλά περιορισμένο σε ευελιξία.

Μπορούν να κινηθούν τα width και height μέσω Animated API;

Ναι, τα width και height κινούνται μέσω Animated API, αλλά δεν υποστηρίζουν useNativeDriver. Για κίνηση ιδιοτήτων διάταξης απαιτείται το πρόγραμμα οδήγησης JavaScript, καθώς το εγγενές πρόγραμμα οδήγησης λειτουργεί μόνο με μη-layout ιδιότητες. Χρησιμοποιήστε Animated.Value με toValue για width/height και ορίστε useNativeDriver σε false. Για καλύτερη απόδοση κινήσεων διάταξης, εξετάστε το LayoutAnimation ή το react-native-reanimated.

Πώς σταματάω την τρέχουσα κίνηση στο Animated API;

Καλέστε τη μέθοδο stop() στο αντικείμενο κίνησης που επέστρεψε το Animated.timing ή Animated.spring. Παράδειγμα: animRef.stop(). Εάν η κίνηση είναι μέρος ενός sequence ή parallel, η stop() σταματά ολόκληρη την ομάδα. Για έλεγχο κατάστασης, χρησιμοποιήστε το callback στο start(callback) — λαμβάνει ένα αντικείμενο result με πεδίο finished: false κατά την αναγκαστική διακοπή.

Τι είναι το Animated.ValueXY και πότε να το χρησιμοποιώ;

Animated.ValueXY είναι ένα δοχείο για δισδιάστατες συντεταγμένες που αποθηκεύει δύο Animated.Value: x και y. Χρησιμοποιήστε το για κίνηση της θέσης ενός στοιχείου στην οθόνη — drag, pan, swipe. Το ValueXY παρέχει έτοιμες μεθόδους getLayout() για στυλ και getTranslateTransform() για μετασχηματισμό. Είναι βολικό όταν εργάζεστε με PanResponder, όπου χρειάζεται να κινηθούν και οι δύο άξονες ταυτόχρονα.

Πώς μετράω τα FPS κίνησης στο React Native;

Χρησιμοποιήστε το React Native Performance Monitor ενσωματωμένο στο μενού προγραμματιστή (Cmd+D / Cmd+M). Ενεργοποιήστε το FPS Monitor — θα εμφανίσει UI FPS και JS FPS σε πραγματικό χρόνο. Για προγραμματική μέτρηση, χρησιμοποιήστε import { InteractionManager } για παρακολούθηση ολοκλήρωσης κινήσεων. Σταθερά 60 UI FPS και 50+ JS FPS αποτελούν ένδειξη καλά βελτιστοποιημένης κίνησης. Εάν το UI FPS πέσει κάτω από 30, απενεργοποιήστε το useNativeDriver ή βελτιστοποιήστε τον αριθμό των ταυτόχρονα εκτελούμενων κινήσεων.

Σύνοψη

  • Animated API — δηλωτική βιβλιοθήκη κίνησης React Native με υποστήριξη εγγενούς προγράμματος οδήγησης για 60 FPS
  • Animated.Value — βασικό δοχείο αριθμητικών τιμών που εγγράφει στοιχεία σε αλλαγές χωρίς επαναφορά
  • Timing, Spring, Decay — τρεις λειτουργίες κίνησης: χρονικά ελεγχόμενη, φυσική ελατηρίου και αδράνειας
  • Παρεμβολή μετατρέπει αριθμητικές περιοχές σε χρώματα, γωνίες, συντεταγμένες — βάση σύνθετων οπτικών εφέ
  • Σύνθεση μέσω sequence, parallel και stagger επιτρέπει τη δημιουργία αλυσίδων κίνησης πολλαπλών βημάτων
  • useNativeDriver είναι υποχρεωτικό για απόδοση — μεταφέρει υπολογισμούς στο εγγενές νήμα UI
  • PanResponder και Gesture Handler ενσωματώνονται με Animated API για διαδραστικές κινήσεις χειρονομιών
  • Χρησιμοποιήστε Animated.event για άμεση σύνδεση χειρονομιών με τιμές χωρίς γέφυρα JavaScript

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης