Animated API هي مكتبة رسوم متحركة تصريحية مدمجة في React Native توفر رسوم متحركة بمعدل 60 إطارًا في الثانية دون تحميل على خيط JavaScript. وفقًا للتوثيق الرسمي لـ React Native 0.76 (2025)، يدعم Animated API useNativeDriver لجميع أنواع الرسوم المتحركة، مما ينقل العمليات الحسابية إلى الخيط الأصلي عبر UI Manager. تتيح المكتبة إنشاء سلاسل رسوم متحركة معقدة وإيماءات تفاعلية واستيفاء أي خصائص نمطية — من الشفافية إلى التحويل.
النقاط الرئيسية
Animated API هي مكتبة رسوم متحركة تصريحية مدمجة في نواة React Native، مصممة لإنشاء رسوم متحركة سلسة وعالية الأداء في تطبيقات الجوال. على عكس رسوم CSS المتحركة في تطوير الويب، يعمل Animated API مباشرة مع خيط UI الأصلي عبر جسر JavaScript أو المشغل الأصلي. تم بناء المكتبة حول مفهوم Animated.Value — حاوية تخزن قيمة رقمية وتشترك تلقائيًا في جميع المكونات التابعة للتغييرات. عندما تتغير القيمة عبر Animated.timing أو Animated.spring، تحسب المكتبة الحالات الوسيطة دون إعادة عرض مكونات React، وهو أمر بالغ الأهمية للحفاظ على 60 إطارًا في الثانية. يدعم Animated API جميع خصائص النمط، بما في ذلك transform و opacity و width و height و top و left و backgroundColor. توصي وثائق React Native باستخدام Animated API لجميع سيناريوهات الرسوم المتحركة التي تتطلب أداءً عاليًا وسلوكًا يمكن التنبؤ به على كلتا المنصتين.
أساس Animated API هو Animated.Value، حاوية قيمة رقمية يتم تهيئتها عبر المُنشئ new Animated.Value(0). يخزن كل Animated.Value رقمًا أوليًا ويوفر طرق تحريك: timing و spring و decay. ينشئ timing رسومًا متحركة خطية أو بتسريع مع معلمات المدة والتأخير والتسريع. ينفذ spring رسومًا متحركة زنبركية فيزيائية مع معلمات الاحتكاك والتوتر والسرعة. ينشئ decay رسومًا متحركة مع القصور الذاتي والتخميد — مفيد للسحب والتمرير. تُرجع جميع الطرق كائن Animated.Composite يمكن تشغيله عبر start() وإيقافه عبر stop(). يتم تنفيذ الرسم المتحرك في خيط منفصل: عند استخدام useNativeDriver = true، تتم العمليات الحسابية في خيط UI الأصلي، ويظل خيط JavaScript حرًا لمعالجة الأحداث والمنطق.
Animated.timing هي طريقة الرسم المتحرك الأساسية بمدة محكومة. تقبل التكوين: toValue و duration (افتراضي 500 مللي ثانية) و easing (Easing.linear افتراضيًا) و delay. تتيح دوال التسريع من وحدة Easing تسريعًا غير خطي: Easing.bezier و Easing.elastic و Easing.bounce. للرسوم المتحركة بسرعة موحدة استخدم Easing.linear، للتسريع الطبيعي استخدم Easing.inOut. مهم: يضمن Animated.timing أن الرسم المتحرك سينتهي بالضبط عند toValue خلال الوقت المحدد، بغض النظر عن حمل الجهاز.
Animated.spring ينفذ نموذج رسم متحرك زنبركي استنادًا إلى قانون هوك. تتحكم معلمة friction (الاحتكاك) في عدد التذبذبات: كلما زاد الاحتكاك، زادت سرعة التوقف. تحدد معلمة tension (التوتر) صلابة الزنبرك: التوتر العالي يسرع الحركة. تحدد معلمة velocity (السرعة) السرعة الأولية للرسم المتحرك مع القصور الذاتي — وهو أمر بالغ الأهمية للرسوم المتحركة التي تتبع إيماءات المستخدم. ليس لـ Animated.spring مدة ثابتة — يكتمل الرسم المتحرك عندما تصل السرعة والسعة إلى قيم العتبة.
يوفر 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).
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')، ألوان ست عشرية ('#ff0000')، كائنات تحويل. يدعم الاستيفاء التسريع و extrapolate — السلوك خارج النطاق المحدد (clamp، extend، identity). على سبيل المثال، أثناء إيماءة السحب، يمكن تحويل موضع الإصبع من 0 إلى 200 إلى شفافية من 1 إلى 0، مما يخلق تأثير تلاشي عند السحب. يسمح نظام الاستيفاء بإنشاء رسوم متحركة معقدة متعددة الخطوات: يمكن تحويل القيمة 0-0.5-1.0 إلى أصفر-برتقالي-أحمر.
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 بتشغيل جميع الرسوم المتحركة في وقت واحد مع رد اتصال إكمال مشترك واحد. يقوم Animated.stagger بتشغيل الرسوم المتحركة مع تأخير بين بداية كل منها — مفيد لإنشاء تأثيرات موجية. يمكن تداخل التراكيب: تسلسل من مجموعات متوازية أو توازي من تسلسلات. يتيح ذلك إنشاء سلاسل معقدة: رسم متحرك لظهور العناصر مع تأخير، slide-in متوازي مع fade-in، ثم تسلسل من bounce و 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 هو خيار تكوين للرسوم المتحركة ينقل كل منطق الرسم المتحرك من خيط JavaScript إلى خيط UI الأصلي. بدون useNativeDriver، يتم تنفيذ الرسوم المتحركة عبر جسر JavaScript: يتم إرسال كل تغيير قيمة إلى الخيط الأصلي، مما يسبب تأخيرات عندما يكون خيط JS مشغولاً بالعمليات غير المتزامنة. مع useNativeDriver = true، يتم تحديث Animated.Value مباشرة على الجانب الأصلي، تاركًا خيط JavaScript حرًا لمعالجة الأحداث وطلبات API ومطابقة React. القيد: يدعم useNativeDriver فقط خصائص غير متعلقة بالتخطيط — opacity و transform و backgroundColor (عبر PlatformColor). بالنسبة لخصائص التخطيط (width، height، top، left)، يلزم NativeAnimatedModule أو LayoutAnimation. وفقًا لـ React Native 0.76، جميع الخصائص المتحركة مدعومة عبر المشغل الأصلي باستثناء تلك القائمة على التخطيط. يوصى باستخدام useNativeDriver لجميع الرسوم المتحركة حيثما أمكن — فهو يرفع FPS من 30-40 إلى 60 ثابتة.
PanResponder هو نظام مدمج في React Native لمعالجة الإيماءات يتكامل جيدًا مع Animated API. يوفر PanResponder استدعاءات onPanResponderMove و onPanResponderRelease حيث يمكن تحديث Animated.Value بناءً على موضع الإصبع. للإيماءات الأكثر تعقيدًا — swipe و pinch و rotation — استخدم مكتبة react-native-gesture-handler، التي تعمل بشكل متزامن مع الرسوم المتحركة وتوفر 60 إطارًا في الثانية حتى مع إيماءات متعددة الأصابع. يوفر Gesture Handler Animated.event — وهي طريقة تربط الإيماءة مباشرة بـ Animated.Value دون معالجة يدوية للاستدعاءات. الجمع بين Gesture Handler + Animated API هو المعيار الصناعي للرسوم المتحركة التفاعلية في تطبيقات React Native.
Animated.event هي طريقة تربط حدثًا أصليًا (مثل gestureEvent) مباشرة بـ Animated.Value. على عكس المعالجة اليدوية في الاستدعاء، يعمل Animated.event بشكل متزامن في الخيط الأصلي ولا يتطلب جسر JavaScript لكل إطار. يوفر هذا رسومًا متحركة سلسة حتى أثناء السحبات السريعة. يقبل Animated.event مصفوفة من التعيينات، حيث يربط كل عنصر حقل حدث بـ Animated.Value. يتم دعم الوصول المتداخل: Animated.event([{ nativeEvent: { translationX: xValue } }]).
دعنا نلقي نظرة على ثلاثة أمثلة عملية لاستخدام Animated API في مشاريع React Native. المثال الأول — رسم متحرك لظهور بطاقة مع تسلسل opacity + translateY. المثال الثاني — رسم متحرك لنبض زر باستخدام spring. المثال الثالث — عنصر سحب تفاعلي مع PanResponder. تستخدم جميع الأمثلة useNativeDriver = true وتتبع أفضل ممارسات 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 المتحرك يخلق تأثير نبض طبيعي باستخدام نموذج زنبرك فيزيائي. إعدادات الاحتكاك المنخفض (2-4) والتوتر العالي (100-150) تعطي تذبذبات ناعمة تخمد بشكل طبيعي. استخدم Animated.loop لنبض لا نهائي مع دورة تسلسل: scale → 1.2، scale → 1.0. يُستخدم النبض لمؤشرات التحميل والإشعارات والأزرار البارزة.
الأسئلة الشائعة
Animated API يوفر تحكمًا كاملاً في الرسم المتحرك — المدة والتسريع والاستيفاء والتركيب. LayoutAnimation هو نظام مدمج في React Native لتحريك تغييرات التخطيط مع استيفاء تلقائي. يتطلب Animated API إعلانًا صريحًا لـ Animated.Value وتكوينًا، ولكنه يسمح بإنشاء سلاسل معقدة. يعمل LayoutAnimation تلقائيًا عند تغيير الحالة وهو أبسط في الاستخدام ولكنه محدود في المرونة.
نعم، يمكن تحريك width و height عبر Animated API، لكنهما لا يدعمان useNativeDriver. للرسوم المتحركة لخصائص التخطيط، يلزم مشغل JavaScript، لأن المشغل الأصلي يعمل فقط مع الخصائص غير المتعلقة بالتخطيط. استخدم Animated.Value مع toValue لـ width/height واضبط useNativeDriver على false. للحصول على أداء أفضل للرسوم المتحركة للتخطيط، فكر في LayoutAnimation أو react-native-reanimated.
استدعِ طريقة stop() على كائن الرسم المتحرك الذي تم إرجاعه بواسطة Animated.timing أو Animated.spring. مثال: animRef.stop(). إذا كان الرسم المتحرك جزءًا من sequence أو parallel، فإن stop() يوقف المجموعة بأكملها. للتحقق من الحالة، استخدم رد الاتصال في start(callback) — يتلقى كائن result مع finished: false عند الإيقاف القسري.
Animated.ValueXY هو حاوية للإحداثيات ثنائية الأبعاد، تخزن اثنين من Animated.Value: x و y. استخدمه لتحريك موضع عنصر على الشاشة — drag و pan و swipe. يوفر ValueXY طرقًا جاهزة getLayout() للأنماط و getTranslateTransform() للتحويل. هذا مناسب عند العمل مع PanResponder حيث يلزم تحريك كلا المحورين في وقت واحد.
استخدم مراقب أداء React Native، المدمج في قائمة المطورين (Cmd+D / Cmd+M). فعّل مراقب FPS — سيعرض FPS لواجهة المستخدم و FPS لـ JavaScript في الوقت الفعلي. للقياس البرمجي، استخدم import { InteractionManager } لتتبع اكتمال الرسم المتحرك. 60 FPS مستقرة لواجهة المستخدم و 50+ FPS لـ JavaScript هي مؤشرات رسم متحرك محسن جيدًا. إذا انخفض FPS لواجهة المستخدم عن 30، فعطّل useNativeDriver أو حسّن عدد الرسوم المتحركة المتزامنة.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.