Az Animated API egy beépített deklaratív animációs könyvtár a React Native-ban, amely 60 FPS-es animációt biztosít a JavaScript szál terhelése nélkül. A React Native 0.76 (2025) hivatalos dokumentációja szerint az Animated API támogatja a useNativeDriver-t minden animációs típushoz, ami a számításokat a natív szálba helyezi át a UI Manager segítségével. A könyvtár lehetővé teszi összetett animációs láncok, interaktív gesztusok és bármely stílustulajdonság interpolációjának létrehozását — az átlátszóságtól a transzformációig.
Főbb pontok
Animated API egy deklaratív animációs könyvtár, amely a React Native magjába van beágyazva, és zökkenőmentes, nagy teljesítményű animációk létrehozására szolgál mobilalkalmazásokban. A webfejlesztésben használt CSS-animációkkal ellentétben az Animated API közvetlenül a natív UI szállal dolgozik a JavaScript hídon vagy a natív illesztőprogramon keresztül. A könyvtár az Animated.Value koncepciója köré épül — egy tároló, amely numerikus értéket tárol, és automatikusan feliratkoztatja az összes függő komponenst a változásokra. Amikor az érték megváltozik az Animated.timing vagy Animated.spring segítségével, a könyvtár kiszámítja a köztes állapotokat anélkül, hogy újrarenderelné a React komponenseket, ami kritikus a 60 FPS fenntartásához. Az Animated API támogatja az összes stílustulajdonságot, beleértve a transform, opacity, width, height, top, left és backgroundColor tulajdonságokat. A React Native dokumentációja az Animated API-t ajánlja minden olyan animációs forgatókönyvhöz, ahol magas teljesítmény és kiszámítható viselkedés szükséges mindkét platformon.
Az Animated API alapja az Animated.Value, egy numerikus érték tároló, amely a new Animated.Value(0) konstruktoron keresztül inicializálódik. Minden Animated.Value tárol egy kezdő számot és animációs módszereket biztosít: timing, spring és decay. A timing metódus lineáris vagy easing animációt hoz létre duration, delay és easing paraméterekkel. A spring metódus fizikai rugós animációt valósít meg friction, tension és velocity paraméterekkel. A decay metódus tehetetlenséggel és csillapítással rendelkező animációt hoz létre — hasznos swipe-okhoz és görgetéshez. Minden metódus egy Animated.Composite objektumot ad vissza, amely a start() segítségével indítható és a stop() segítségével állítható le. Az animáció egy külön szálon fut: useNativeDriver = true használatakor a számítások a natív UI szálban történnek, a JavaScript szál szabad marad az események és logika feldolgozásához.
Animated.timing az alapvető animációs metódus szabályozható időtartammal. Konfigurációt fogad: toValue, duration (alapértelmezett 500ms), easing (alapértelmezett Easing.linear) és delay. Az Easing modulból származó easing függvények nemlineáris gyorsítást tesznek lehetővé: Easing.bezier, Easing.elastic, Easing.bounce. Egyenletes sebességű animációhoz használja az Easing.linear-t, természetes gyorsításhoz az Easing.inOut-ot. Fontos: Az Animated.timing garantálja, hogy az animáció pontosan a toValue értékben fejeződik be a megadott időn belül, függetlenül az eszköz terhelésétől.
Animated.spring a Hooke-törvényen alapuló rugós animációs modellt valósít meg. A friction (súrlódás) paraméter szabályozza az oszcillációk számát: minél magasabb a friction, annál gyorsabb a megállás. A tension (feszültség) paraméter határozza meg a rugó merevségét: a magas tension gyorsítja a mozgást. A velocity paraméter beállítja a kezdősebességet a tehetetlenséggel rendelkező animációhoz — kritikus a felhasználó gesztusát követő animációkhoz. Az Animated.spring-nek nincs rögzített időtartama — az animáció akkor ér véget, amikor a sebesség és az amplitúdó eléri a küszöbértékeket.
Az Animated API négy beépített animált komponenst biztosít: Animated.View, Animated.Text, Animated.ScrollView és Animated.Image. Mindegyik egy burkoló a megfelelő natív komponens körül, amely támogatja az Animated.Value átadását a stílustulajdonságokban. Az Animated.View a leggyakrabban használt komponens, ugyanazokat a props-okat fogadja el, mint egy szokásos View, de támogatja az animált értékeket a style-ban. Az Animated.Text hasznos a szöveg színének vagy a betűközök animálásához. Az Animated.ScrollView lehetővé teszi a scrollTo és contentOffset animálását. Az Animated.Image támogatja az animált átlátszóságot és méretarányt a képek betöltésekor. Ha egy másik komponenst szeretne animálni, használja a Animated.createAnimatedComponent(MyComponent) metódust.
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}
);
};
Interpoláció egy mechanizmus az Animated.Value bemeneti numerikus tartományának más típusú kimeneti értékekké alakításához. Az interpolate metódus konfigurációt fogad inputRange (bemeneti értékek tömbje) és outputRange (kimeneti értékek tömbje) paraméterekkel. OutputRange típusok: számok (koordináták, átlátszóság), karakterláncok (forgási szögek 'deg'-vel), hex színek ('#ff0000'), transzformációs objektumok. Az interpoláció támogatja az easing és extrapolate — a megadott tartományon kívüli viselkedést (clamp, extend, identity). Például egy húzási gesztusnál az ujj pozíciója 0-tól 200-ig átalakítható átlátszósággá 1-től 0-ig, halványulási effektust létrehozva swipe-nál. Az interpolációs rendszer lehetővé teszi összetett több lépésből álló animációk létrehozását: a 0-0.5-1.0 érték átalakulhat sárga-narancs-piros színekké.
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'],
});
Az Animated API három animációs kompozíciós módot támogat: Animated.sequence, Animated.parallel és Animated.stagger. Az Animated.sequence egymás után indítja az animációkat: minden következő az előző befejezése után kezdődik. Az Animated.parallel egyszerre indítja az összes animációt egy közös befejezési callback-kel. Az Animated.stagger késleltetéssel indítja az animációkat az egyes kezdések között — késleltetett kezdés, hasznos hullámeffektusok létrehozásához. A kompozíciók egymásba ágyazhatók: sequence parallel csoportokból vagy parallel sequence-ből. Ez lehetővé teszi összetett láncok létrehozását: elemek megjelenésének animációja késleltetéssel, párhuzamos slide-in fade-in-nel, majd sequence bounce-ból és shake-ből.
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 egy animációs konfigurációs opció, amely a teljes animációs logikát a JavaScript szálból a natív UI szálba helyezi át. useNativeDriver nélkül az animációk a JavaScript hídon keresztül futnak: minden értékváltozás elküldésre kerül a natív szálba, ami késéseket okoz, amikor a JS szál aszinkron műveletekkel van terhelve. useNativeDriver = true esetén az Animated.Value közvetlenül a natív oldalon frissül, a JavaScript szál szabad marad az események, API-kérések és React egyeztetés feldolgozásához. Korlátozás: a useNativeDriver csak nem-layout tulajdonságokat támogat — opacity, transform, backgroundColor (PlatformColor segítségével). Layout tulajdonságokhoz (width, height, top, left) NativeAnimatedModule vagy LayoutAnimation szükséges. A React Native 0.76 szerint az összes animált tulajdonság támogatott a natív illesztőprogramon keresztül, kivéve a layout-alapúakat. A useNativeDriver mód minden olyan animációhoz ajánlott, ahol lehetséges — ez 30-40 FPS-ről stabil 60-ra növeli a képkockasebességet.
PanResponder egy beépített React Native rendszer gesztusok feldolgozásához, amely kiválóan integrálódik az Animated API-val. A PanResponder onPanResponderMove és onPanResponderRelease callback-eket biztosít, ahol az Animated.Value frissíthető az ujj pozíciója alapján. Összetettebb gesztusokhoz — swipe, pinch, rotation — használja a react-native-gesture-handler könyvtárat, amely szinkronban dolgozik az animációkkal és 60 FPS-t biztosít még többujjas gesztusoknál is. A Gesture Handler biztosítja az Animated.event-et — egy metódust, amely közvetlenül összeköti a gesztust az Animated.Value-vel a callback-ek manuális feldolgozása nélkül. A Gesture Handler + Animated API kombináció az ipari szabvány az interaktív animációkhoz React Native alkalmazásokban.
Animated.event egy metódus, amely a natív eseményt (pl. gestureEvent) közvetlenül összeköti az Animated.Value-vel. Ellentétben a manuális feldolgozással callback-ben, az Animated.event szinkronban működik a natív szálban, és nem igényel JavaScript hidat minden egyes képkockához. Ez zökkenőmentes animációt biztosít még gyors swipe-oknál is. Az Animated.event egy leképezések tömbjét fogadja, ahol minden elem egy eseménymezőt köt össze az Animated.Value-vel. A beágyazott hozzáférés támogatott: Animated.event([{ nativeEvent: { translationX: xValue } }]).
Nézzünk meg három gyakorlati példát az Animated API használatára React Native projektekben. Az első példa — egy kártya megjelenési animációja opacity + translateY szekvenciával. A második példa — egy gomb pulzáló animációja spring használatával. A harmadik példa — interaktív húzható elem PanResponderrel. Minden példa useNativeDriver = true-t használ, és megfelel a React Native 0.76 legjobb gyakorlatainak.
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-animáció természetes pulzáló hatást hoz létre a fizikai rugómodellnek köszönhetően. Az alacsony friction (2-4) és magas tension (100-150) beállítása lágy oszcillációkat eredményez, amelyek természetesen csillapodnak. Használja az Animated.loop-ot végtelen pulzáláshoz sequence ciklussal: scale → 1.2, scale → 1.0. A pulzálás betöltési jelzőkhöz, értesítésekhez és akcentus gombokhoz alkalmazható.
Gyakran ismételt kérdések
Animated API teljes körű vezérlést biztosít az animáció felett — időtartam, easing, interpoláció, kompozíció. A LayoutAnimation egy beépített React Native rendszer a layout-változtatások animálásához automatikus interpolációval. Az Animated API megköveteli az Animated.Value és a konfiguráció explicit deklarálását, de lehetővé teszi összetett láncok létrehozását. A LayoutAnimation automatikusan aktiválódik az állapotváltozásnál és egyszerűbb használni, de rugalmasságban korlátozott.
Igen, a width és height animálható az Animated API-n keresztül, de nem támogatja a useNativeDriver-t. A layout tulajdonságok animálásához JavaScript illesztőprogram szükséges, mivel a natív illesztőprogram csak nem-layout tulajdonságokkal dolgozik. Használjon Animated.Value-t toValue-val a width/height-hoz, és állítsa a useNativeDriver-t false-ra. A layout-animációk jobb teljesítményéhez fontolja meg a LayoutAnimation vagy a react-native-reanimated használatát.
Hívja meg a stop() metódust az Animated.timing vagy Animated.spring által visszaadott animációs objektumon. Példa: animRef.stop(). Ha az animáció egy sequence vagy parallel része, a stop() leállítja a teljes csoportot. Az állapot ellenőrzéséhez használja a callback-et a start(callback)-ben — egy result objektumot kap a finished: false mezővel kényszerített leállítás esetén.
Animated.ValueXY egy kétdimenziós koordináta-tároló, amely két Animated.Value-t tárol: x és y. Használja egy elem képernyőn lévő pozíciójának animálásához — drag, pan, swipe. A ValueXY kész metódusokat biztosít: getLayout() a stílusokhoz és getTranslateTransform() a transzformációhoz. Ez kényelmes a PanResponderrel való munkánál, ahol mindkét tengelyt egyszerre kell animálni.
Használja a React Native Performance Monitor-t, amely a fejlesztői menübe van beépítve (Cmd+D / Cmd+M). Kapcsolja be a FPS Monitor-t — valós időben mutatja az UI FPS-t és JS FPS-t. Programozott méréshez használja a import { InteractionManager } utasítást az animációk befejezésének nyomon követéséhez. A stabil 60 UI FPS és 50+ JS FPS a jól optimalizált animáció jelzője. Ha az UI FPS 30 alá csökken, kapcsolja ki a useNativeDriver-t vagy optimalizálja az egyidejűleg futó animációk számát.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is