Ang Animated API ay isang built-in na deklaratibong library ng animation sa React Native na nagbibigay ng 60 FPS na animation nang hindi naglo-load sa JavaScript thread. Ayon sa opisyal na dokumentasyon ng React Native 0.76 (2025), sinusuportahan ng Animated API ang useNativeDriver para sa lahat ng uri ng animation, na naglilipat ng mga kalkulasyon sa native thread sa pamamagitan ng UI Manager. Ang library ay nagbibigay-daan sa paglikha ng mga kumplikadong chain ng animation, interaktibong galaw, at interpolation ng anumang katangian ng estilo — mula sa transparency hanggang sa pagbabago.
Mga Pangunahing Punto
Animated API ay isang deklaratibong library ng animation na naka-embed sa core ng React Native, na idinisenyo para sa paglikha ng maayos at may mataas na pagganap na animation sa mga mobile application. Hindi tulad ng CSS animation sa web development, ang Animated API ay direktang gumagana sa native UI thread sa pamamagitan ng JavaScript bridge o native driver. Ang library ay binuo sa paligid ng konsepto ng Animated.Value — isang lalagyan na nag-iimbak ng numerikong halaga at awtomatikong nag-subscribe ng lahat ng umaasang component sa mga pagbabago. Kapag binago ang halaga sa pamamagitan ng Animated.timing o Animated.spring, kinakalkula ng library ang mga intermediate na estado nang hindi ni-re-render ang mga React component, na kritikal para sa pagpapanatili ng 60 FPS. Sinusuportahan ng Animated API ang lahat ng katangian ng estilo, kabilang ang transform, opacity, width, height, top, left, at backgroundColor. Inirerekomenda ng dokumentasyon ng React Native ang Animated API para sa lahat ng senaryo ng animation na nangangailangan ng mataas na pagganap at mahuhulaan na pag-uugali sa parehong platform.
Ang pundasyon ng Animated API ay Animated.Value, isang lalagyan ng numerikong halaga na sinisimulan sa pamamagitan ng constructor na new Animated.Value(0). Ang bawat Animated.Value ay nag-iimbak ng panimulang numero at nagbibigay ng mga pamamaraan ng animation: timing, spring, at decay. Ang timing method ay gumagawa ng linear o easing animation na may mga parameter na duration, delay, at easing. Ang spring method ay nagpapatupad ng pisikal na spring animation na may mga parameter na friction, tension, at velocity. Ang decay method ay gumagawa ng animation na may inertia at pamamasa — kapaki-pakinabang para sa swipe at scroll. Lahat ng pamamaraan ay nagbabalik ng Animated.Composite object na maaaring simulan sa pamamagitan ng start() at ihinto sa pamamagitan ng stop(). Ang animation ay isinasagawa sa isang hiwalay na thread: kapag gumagamit ng useNativeDriver = true, ang mga kalkulasyon ay nangyayari sa native UI thread, ang JavaScript thread ay nananatiling libre para sa pagproseso ng mga kaganapan at lohika.
Animated.timing ay ang pangunahing pamamaraan ng animation na may kontroladong tagal. Tumatanggap ng configuration: toValue, duration (default 500ms), easing (default Easing.linear), at delay. Ang mga easing function mula sa Easing module ay nagbibigay-daan sa non-linear na acceleration: Easing.bezier, Easing.elastic, Easing.bounce. Para sa animation na may pare-parehong bilis gamitin ang Easing.linear, para sa natural na acceleration — Easing.inOut. Mahalaga: Ginagarantiyahan ng Animated.timing na matatapos ang animation nang eksakto sa toValue sa tinukoy na oras, anuman ang load ng device.
Animated.spring ay nagpapatupad ng spring model ng animation batay sa batas ni Hooke. Ang parameter na friction (friction) ay kumokontrol sa bilang ng mga oscillation: mas mataas ang friction, mas mabilis ang paghinto. Ang parameter na tension (tension) ay tumutukoy sa tigas ng spring: ang mataas na tension ay nagpapabilis ng paggalaw. Ang parameter na velocity ay nagtatakda ng paunang bilis para sa animation na may inertia — mahalaga para sa mga animation na sumusunod sa galaw ng gumagamit. Ang Animated.spring ay walang nakapirming tagal — nagtatapos ang animation kapag ang bilis at amplitude ay umabot sa mga halaga ng threshold.
Ang Animated API ay nagbibigay ng apat na built-in na animated na component: Animated.View, Animated.Text, Animated.ScrollView, at Animated.Image. Ang bawat isa ay isang wrapper sa ibabaw ng kaukulang native component na sumusuporta sa pagpapasa ng Animated.Value sa mga katangian ng estilo. Ang Animated.View ay ang pinakaginagamit na component, tumatanggap ng parehong props gaya ng regular na View, ngunit may suporta para sa mga animated na halaga sa style. Ang Animated.Text ay kapaki-pakinabang para sa animation ng kulay ng teksto o spacing sa pagitan ng mga titik. Ang Animated.ScrollView ay nagbibigay-daan sa animation ng scrollTo at contentOffset. Sinusuportahan ng Animated.Image ang animated na transparency at scale habang naglo-load ng mga larawan. Kung kailangan mong i-animate ang ibang component, gamitin ang Animated.createAnimatedComponent(MyComponent).
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}
);
};
Interpolation ay isang mekanismo para sa pag-convert ng input numerikong range ng Animated.Value sa mga output na halaga ng ibang uri. Ang pamamaraang interpolate ay tumatanggap ng configuration na may inputRange (array ng mga input value) at outputRange (array ng mga output value). Mga uri ng outputRange: mga numero (coordinate, transparency), mga string (mga anggulo ng pag-ikot na may 'deg'), mga hex na kulay ('#ff0000'), mga object ng pagbabago. Sinusuportahan ng interpolation ang easing at extrapolate — pag-uugali sa labas ng tinukoy na range (clamp, extend, identity). Halimbawa, sa drag gesture, ang posisyon ng daliri mula 0 hanggang 200 ay maaaring i-convert sa transparency mula 1 hanggang 0, na lumilikha ng epekto ng pag-fade sa swipe. Ang sistema ng interpolation ay nagbibigay-daan sa paglikha ng mga kumplikadong multi-step na animation: ang halaga na 0-0.5-1.0 ay maaaring magbago sa dilaw-kahel-pula.
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'],
});
Sinusuportahan ng Animated API ang tatlong mode ng komposisyon ng animation: Animated.sequence, Animated.parallel, at Animated.stagger. Ang Animated.sequence ay nagpapatakbo ng mga animation nang isa-isa: ang bawat kasunod ay magsisimula pagkatapos makumpleto ang nauna. Ang Animated.parallel ay nagpapatakbo ng lahat ng animation nang sabay-sabay na may isang karaniwang callback ng pagkumpleto. Ang Animated.stagger ay nagpapatakbo ng mga animation na may pagkaantala sa pagitan ng pagsisimula ng bawat isa — naantalang pagsisimula, kapaki-pakinabang para sa paglikha ng mga wave effect. Ang mga komposisyon ay maaaring i-nest sa isa't isa: sequence ng parallel group o parallel ng sequence. Nagbibigay-daan ito sa paglikha ng mga kumplikadong chain: animation ng paglitaw ng mga elemento na may pagkaantala, parallel slide-in na may fade-in, pagkatapos sequence ng bounce at shake.
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 ay isang opsyon sa configuration ng animation na naglilipat ng buong lohika ng animation mula sa JavaScript thread patungo sa native UI thread. Kung walang useNativeDriver, ang mga animation ay isinasagawa sa pamamagitan ng JavaScript bridge: bawat pagbabago ng halaga ay ipinapadala sa native thread, na nagdudulot ng mga pagkaantala kapag ang JS thread ay na-load ng mga asynchronous na operasyon. Sa useNativeDriver = true, ang Animated.Value ay ina-update nang direkta sa native side, at ang JavaScript thread ay nananatiling libre para sa pagproseso ng mga kaganapan, mga kahilingan sa API, at React reconciliation. Limitasyon: sinusuportahan lamang ng useNativeDriver ang mga non-layout na katangian — opacity, transform, backgroundColor (sa pamamagitan ng PlatformColor). Para sa mga layout na katangian (width, height, top, left) kinakailangan ang NativeAnimatedModule o LayoutAnimation. Ayon sa React Native 0.76, lahat ng animated na katangian maliban sa layout-based ay sinusuportahan sa pamamagitan ng native driver. Ang useNativeDriver mode ay inirerekomenda para sa lahat ng animation kung saan posible — pinapataas nito ang FPS mula 30-40 hanggang sa matatag na 60.
PanResponder ay isang built-in na sistema ng React Native para sa pagproseso ng galaw na mahusay na nakikipag-ugnayan sa Animated API. Ang PanResponder ay nagbibigay ng mga callback na onPanResponderMove at onPanResponderRelease, kung saan maaaring i-update ang Animated.Value batay sa posisyon ng daliri. Para sa mas kumplikadong mga galaw — swipe, pinch, rotation — gamitin ang library na react-native-gesture-handler, na gumagana nang sabay-sabay sa mga animation at tinitiyak ang 60 FPS kahit na sa multi-finger gestures. Ang Gesture Handler ay nagbibigay ng Animated.event — isang pamamaraan na direktang nag-uugnay ng galaw sa Animated.Value nang walang manu-manong pagproseso ng callback. Ang kombinasyon ng Gesture Handler + Animated API ay ang pamantayan ng industriya para sa mga interaktibong animation sa mga aplikasyon ng React Native.
Animated.event ay isang pamamaraan na nag-uugnay ng native na kaganapan (hal. gestureEvent) nang direkta sa Animated.Value. Hindi tulad ng manu-manong pagproseso sa callback, ang Animated.event ay gumagana nang sabay-sabay sa native thread at hindi nangangailangan ng JavaScript bridge para sa bawat frame. Nagbibigay ito ng maayos na animation kahit na sa mabilis na swipe. Ang Animated.event ay tumatanggap ng array ng mga mapping, kung saan ang bawat elemento ay nag-uugnay ng field ng kaganapan sa Animated.Value. Ang nested access ay sinusuportahan: Animated.event([{ nativeEvent: { translationX: xValue } }]).
Tingnan natin ang tatlong praktikal na halimbawa ng paggamit ng Animated API sa mga proyekto ng React Native. Unang halimbawa — animation ng paglitaw ng card na may sequence na opacity + translateY. Pangalawang halimbawa — animation ng pagpintig ng button gamit ang spring. Pangatlong halimbawa — interaktibong drag element na may PanResponder. Lahat ng halimbawa ay gumagamit ng useNativeDriver = true at sumusunod sa pinakamahusay na kasanayan ng React Native 0.76.
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 animation ay lumilikha ng natural na epekto ng pagpintig dahil sa pisikal na spring model. Ang pagtatakda ng mababang friction (2-4) at mataas na tension (100-150) ay nagbibigay ng malambot na oscillation na natural na kumukupas. Gamitin ang Animated.loop para sa walang katapusang pagpintig na may cycle na sequence: scale → 1.2, scale → 1.0. Ang pagpintig ay inilalapat para sa mga indicator ng pag-load, mga notification, at mga accent button.
Mga Madalas Itanong
Animated API ay nagbibigay ng buong kontrol sa animation — tagal, easing, interpolation, komposisyon. Ang LayoutAnimation ay isang built-in na sistema ng React Native para sa animation ng mga pagbabago sa layout na may awtomatikong interpolation. Ang Animated API ay nangangailangan ng malinaw na deklarasyon ng Animated.Value at configuration, ngunit nagbibigay-daan sa paglikha ng mga kumplikadong chain. Ang LayoutAnimation ay awtomatikong nag-a-activate kapag nagbago ang state at mas simple gamitin, ngunit limitado sa flexibility.
Oo, ang width at height ay na-animate sa pamamagitan ng Animated API, ngunit hindi sinusuportahan ang useNativeDriver. Para sa animation ng mga layout na katangian, kinakailangan ang JavaScript driver, dahil ang native driver ay gumagana lamang sa mga non-layout na katangian. Gumamit ng Animated.Value na may toValue para sa width/height at itakda ang useNativeDriver sa false. Para sa mas mahusay na pagganap ng layout animation, isaalang-alang ang LayoutAnimation o react-native-reanimated.
Tawagan ang pamamaraang stop() sa object ng animation na ibinalik ng Animated.timing o Animated.spring. Halimbawa: animRef.stop(). Kung ang animation ay bahagi ng sequence o parallel, hihinto ng stop() ang buong grupo. Para suriin ang status, gamitin ang callback sa start(callback) — tumatanggap ito ng result object na may field na finished: false kapag pinilit na paghinto.
Animated.ValueXY ay isang lalagyan para sa dalawang-dimensional na coordinate na nag-iimbak ng dalawang Animated.Value: x at y. Gamitin ito para sa animation ng posisyon ng elemento sa screen — drag, pan, swipe. Ang ValueXY ay nagbibigay ng mga handa nang pamamaraan na getLayout() para sa mga estilo at getTranslateTransform() para sa pagbabago. Ito ay maginhawa kapag nagtatrabaho sa PanResponder, kung saan kailangang i-animate ang parehong axis nang sabay-sabay.
Gamitin ang React Native Performance Monitor na naka-embed sa dev menu (Cmd+D / Cmd+M). I-activate ang FPS Monitor — ipapakita nito ang UI FPS at JS FPS sa real-time. Para sa programmatic na pagsukat, gamitin ang import { InteractionManager } para subaybayan ang pagkumpleto ng mga animation. Ang matatag na 60 UI FPS at 50+ JS FPS ay indikasyon ng mahusay na na-optimize na animation. Kung ang UI FPS ay bumaba sa ibaba 30, i-off ang useNativeDriver o i-optimize ang bilang ng sabay-sabay na tumatakbong animation.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din